(六)JDK源码分析之可重入读写锁ReentrantReadWriteLock
-
概述
可重入读写锁,其实就是在重入锁基础上区分了一下读写锁.读写锁也称为共享锁,也就是说可以多个线程同时获取锁,这样大大提高了系统的吞吐量. 读写锁中 读锁和读锁是共享的,写锁和读锁写锁都是互斥的. -
锁的状态如何区分读写锁
我们经过前面分析,知道在同步器中,用了一个int型来表示一个状态,当这个int值不为0时,说明这个时候锁是被获取了的,这个时候其他线程只能自旋等待, 当然到了读写锁也不例外,因为底层用的都是同一个同步器AbstractQueuedSynchronizer,所以依然是使用一个整形来表示锁的状态,那么如何来分别表示读锁和写锁的状态,看下图
如图,因为一个int类型是四个字节,一共是32位,这个时候用的策略就是使用高16位表示读锁的重入次数,用低16位表示写锁重入次数,这样就可以分别表示出读写锁的状态了.比如上面读锁的状态是2,写锁的状态是3,但是这个带来的问题是,状态的值缩短了一半
在读写锁实现中使用了位运算来分别计算读写锁当前的状态值
a.sharedCount函数返回读锁的当前状态值
b.exclusiveCount函数返回写锁的当前状态值 -
读锁源码分析