概述
aqs中使用的FIFO队列是clh自旋锁的一个变种,所以理解clh对理解aqs很有帮助。
自旋锁适合于加锁时间短的任务,一直忙等。互斥锁适合加锁时间长的任务,需要wait,notify。
附上clh自旋锁java实现。
public class CLHLock {
private class Node {
private volatile boolean locked;
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
}
private final ThreadLocal<Node> prev = ThreadLocal.withInitial(() -> null);
private final ThreadLocal<Node> current = ThreadLocal.withInitial(Node::new);
private final AtomicReference<Node> tail = new AtomicReference<>(new Node());
public void lock(){
Node node = this.current.get();
node.setLocked(true);
Node pred = tail.getAndSet(node);
this.prev.set(pred);
while(this.prev.get().isLocked()){
}
}
public void unlock(){
Node node = this.current.get();
node.setLocked(false);
this.current.set(this.prev.get());
}
public static void main(String[] args) {
CLHLock clhLock = new CLHLock();
for(int i = 0; i < 10; i++){
new Thread(() -> {
clhLock.lock();
System.out.println(Thread.currentThread().getName() + "获取锁");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
clhLock.unlock();
}
}, "线程" + i).start();
}
}
}
最后
以上就是神勇毛豆为你收集整理的clh自旋锁的全部内容,希望文章能够帮你解决clh自旋锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复