JAVA并发编程之ReentrantLock源码理解

带着问题看源码

        公平锁和非公平锁如何实现

        锁竞争,入队操作

        释放锁,出队操作

公平锁和非公平锁

在ReentrantLock内部,实现了FairSync和NonfairSync两个内部类,这两个类都继承了抽象类Sync,Sync又继承了AQS抽象类。

默认为非公平锁

非公平锁lock操作流程

        线程1

        进入lock()方法时,先进行一次CAS,因为当前无其他线程进入,所以CAS成功,state值设为1,同时设置  exclusiveOwnerThread = 线程1

        当前状态 

                state=1

                exclusiveOwnerThread = 线程1

        线程2

        进入lock()方法,先进行一次CAS看是否能争夺到锁,此时state=1,进入acquire()方法,此方法主要是再次取锁 和构建 双项链表,存入等待线程。

acquire方法

tryAcquire详解

        我们这里对非公平锁进行详解

        addWaiter详解

        这个方法主要是构建Node节点,首次入参传递的null

        Node类

        关注这4个属性,线程,前节点,后节点,等待状态。

先构建一个Node节点进去enq方法

循环创建节点,这个for循环 创建双项节点的思路妙!

最终构建的节点结构,为什么头节点的thread是null ,我们可以理解为 头节点为获取到锁的线程,后面的都是等待线程。

acquireQueued方法详解

线程1解锁

线程2获得锁

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值