ReentrantLock的实现原理

了解ReentrantLock的实现原理之前先梳理一下它所关联的知识点:

  • 首先ReentrantLock是基于AbstractQueuedSynchronizer的,AbstractQueuedSynchronizer是此锁同步控制的基础,使用AQS的状态来表示持有该锁的数量。
  • AbstractQueuedSynchronizer中的等待队列是CLS队列锁的变种
  • CLS锁是一种基于链表的高性能,可扩展,公平的自旋锁,申请线程仅仅在本地变量上自旋,不断轮询前驱的状态,如果前驱释放了锁就结束自旋。
  • CLS代码中用到了ThreadLocal类和AtomicReference(可以保证以原子方式更新对象引用)。CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程须要获取锁,且不释放锁;为false表示线程释放了锁。
  • AtomicReference类可以保证引用对象读写的原子性,当多个进程同时操作此引用对象的时候,仅仅有一个线程可以操作。
    CAS算法原理。

ReentrantLock有一个抽象类Sync,通过ReentrantLock的构造方法实例化出公平的Sync和非公平的Sync,默认构造非公平锁。(NonfairSync类和FairSync类都继承了抽象类Sync)。
compareAndSetState是AbstractQueuedSynchronizer中的方法,通过compareAndSetState设置state为1。
如果当前的状态值等于期望的状态值,则原子性的设置同步状态为更新的值,此操作使用到了乐观锁CAS。
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
同步状态state是volatile的,volatile关键字保证了变量的内存可见性。

基本概念理清楚后可以查看此博客,作者写的很详细:https://www.cnblogs.com/xrq730/p/4979021.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值