读写锁实现了AQS的共享锁和独占锁两种模式,原理是将一个int值,按位分割成高16位来标记读,和低16位来标记写.内部有一个 int exclusiveCount(int c) 用来计算独占锁的数目,一个 int sharedCount(int c) 用来计算共享锁的数目,
写锁的获取在有读锁已被获取的情况下进行等待,没有读的时候跟ReentrantLock 类似;读锁在没有写锁的情况下就可以用cas尝试更新state了,失败则放入等待队列,用死循环来等待.
写锁重入的实现跟ReentrantLock类似,只不过只能支持低16位最大数次重入,读锁的重入利用ThreadLocale来存放重入次数.
写锁获取