Java-----ReentrantReadWriteLock的公平和非公平机制的实现

本文详细解析了ReentrantReadWriteLock中的公平锁与非公平锁实现机制,通过对比writerShouldBlock函数在两种锁中的不同行为,揭示了它们如何影响线程调度的公平性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇记录ReentrantReadWriteLock公平锁和非公平锁的实现。

最开始看了些博客上面都提到了ReentrantReadWriteLock公平锁和非公平锁。于是自己想看看锁是长啥样的。最后看了半天,才明白他们说的锁不是我理解的真正存在的一个lock,而是一种机制,通过一些操作,实现了公平与非公平的机制.。

创建

实现类:

发现其实现类都重写了writerShouldBlock、readerShouldBlock函数返回boolean.里面调用了

AbstractQueuedSynchronizer类(线程同步队列类)的方法询问队列是否还有执行的线程。需要注意的是非公平机制中的writerShouldBlock直接返回的是false

下面我们主要看其writerShouldBlock方法的使用:(重点)

         在tryAcquire中:

               

这里就是其公平和非公平锁的实现:

         当一个新线程,首先会将其加入同步队列,其次会调用tryAcquire尝试去执行这个线程。

           对于公平锁来说,writerShouldBlock会判断队列是否含还有排队的线程,如果有,返回ture. 不执行新加的线程。

           对于非公平锁来说,writerShouldBlock直接返回false,直接执行compareAndSetState------CAS操作(什么是CAS操作)。

           在CAS操作中,其回去请求对象锁,如果对象锁被别的线程占据,则自旋。所以不是按队列顺序去执行线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值