ReentrantReadWriteLock获取锁及释放锁流程

本文详细介绍了ReentrantReadWriteLock的工作原理及其内部实现机制。重点解释了读锁与写锁的区别,包括它们如何处理多线程并发访问的问题。此外,还探讨了AQS状态字段在读写锁中的特殊用法。

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

ReentrantReadWriteLock:可重入读写锁

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

多个线程可以同时进入同一个读锁

多个线程不能同时进入同一个写锁

多个线程不能同时进入同一对读锁、写锁

一个线程可以先进入写锁、再进入读锁

一个线程可以先进入写锁、再进入读锁、再进入写锁

一个线程不能先进入读锁、再进入写锁【这种情况会导致线程卡死】

参考前一篇文章,ReentrantReadWriteLock也是使用AQS的state、exclusiveOwnerThread来实现读写锁协作的。

ReentrantLock中使用的AQS.state是用来记录同一个线程重入的次数。

ReentrantReadWriteLock中使用的AQS.state需要被读锁、写锁同时使用,因此int AQS.state被分成了两半:高16位、低16位。

state高16位:记录进入读锁的线程数+重入次数,统称读锁次数。

state低16位:记录写锁的重入次数,统称写锁次数。

因为存在“获取写锁-获取读锁”的流程,所以state的高16位和低16位均有可能有值。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值