ReentrantReadWriteLock获取锁及释放锁流程

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位均有可能有值。

ReentrantReadWriteLock获取锁及释放锁流程_第1张图片


你可能感兴趣的:(Java)