ReentrantLock原理

Posted jdktomcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock原理相关的知识,希望对你有一定的参考价值。

ReentrantLock主要利用CAS+CLH队列来实现。它支持公平锁和非公平锁,两者的实现类似。

  • CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,
                将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是sun.
                misc.Unsafe这个类通过JNI调用CPU底层指令实现。
  • CLH队列:带头结点的双向非循环链表
    技术分享图片
  • ReentrantLock的基本实现可以概括为:先通过CAS尝试获取锁。如果此时已经有线程占据了锁,那就加入CLH队列并且被挂起。
    当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果:

    • 非公平锁:如果同时还有另一个线程进来尝试获取,那么有可能会让这个线程抢先获取;
    • 公平锁:如果同时还有另一个线程进来尝试获取,当它发现自己不是在队首的话,就会排到队尾,由队首的线程获取到锁。




以上是关于ReentrantLock原理的主要内容,如果未能解决你的问题,请参考以下文章

浅析ReentrantLock

ReentrantLock实现原理深入探究

ReentrantLock原理详解

ReentrantLock原理ReentrantReadWriteLock原理

ReentrantLock原理,ReentrantLock和synchronized区别

从ReentrantLock的实现看AQS的原理及应用