自旋锁
public class SpinLock {
private AtomicReference<Thread> owner = new AtomicReference<Thread>();
public void lock() {
Thread currentThread = Thread.currentThread();
// 如果锁未被占用,则设置当前线程为锁的拥有者
while (!owner.compareAndSet(null, currentThread)) {
}
}
public void unlock() {
Thread currentThread = Thread.currentThread();
// 只有锁的拥有者才能释放锁
owner.compareAndSet(currentThread, null);
}
}
CLH
CLH是自旋锁的一种优化。
自旋锁仅有一个临界资源,当竞争激烈时,性能比较低。
CLH为了降低竞争,引入Node概念。只有相邻的才会有竞争。
而且在参考文章中,讲到了 volatile的意义,竟然不是可见性原因,而是保证有序性(Happens-before)。
而且还讲到了死锁。
CLH一个NB的地方还在于,虽然是个链表,但是却没有什么前驱、后继指针。