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