码迷,mamicode.com
首页 > 其他好文 > 详细

ReentrantLock原理

时间:2019-01-11 11:42:22      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:log   tps   nsa   技术分享   头结点   mis   交换   9.png   ima   

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原理

标签:log   tps   nsa   技术分享   头结点   mis   交换   9.png   ima   

原文地址:https://www.cnblogs.com/jdktomcat/p/10253778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!