ReentrantLock的公平锁和非公平锁实现图解

公平锁的获取和释放:

在这里插入图片描述
可以看到这个过程跟AQS独占锁的获取和释放是一样的,实现公平锁的关键是tryRelease方法的实现:
在这里插入图片描述

公平锁实现关键:

当有资源时也会判断当前有没有线程在等待,只要有线程在等待不管有没有资源都要排队等待,这就保证了线程完全是按先后顺序执行。

可重入实现细节:

同一个线程可以在没有资源情况下无限次获取锁,通过上图可以看到,在state不是0的情况下会判断当前线程是否是持锁线程,是的情况下会改变state的值并return true。此时要注意,同一个线程lock几次,也要unlock几次,不然会死锁。

非公平锁的获取和释放:

在这里插入图片描述

非公平锁有两次非公平的方式:

1.在刚调lock时会直接CAS尝试获取锁。
2.在nonfairTryAcquire方法中发现有资源的情况下会直接CAS尝试获取锁,而不会管等待队列中有没有其他线程在排队。

公平锁和非公平锁实现细节差异:

公平锁在有资源的情况下也会判断等待队列中是否有线程在等待,而非公平锁会有两次非公平获锁的机会,但如果失去这两次机会则也要乖乖的排队等候按时间顺序执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值