java基础:CLH

79 阅读1分钟

自旋锁

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是自旋锁的一种优化。

图片.png

自旋锁仅有一个临界资源,当竞争激烈时,性能比较低。

CLH为了降低竞争,引入Node概念。只有相邻的才会有竞争。

而且在参考文章中,讲到了 volatile的意义,竟然不是可见性原因,而是保证有序性(Happens-before)。

而且还讲到了死锁。

CLH一个NB的地方还在于,虽然是个链表,但是却没有什么前驱、后继指针。

参考

-Java AQS 核心数据结构-CLH 锁