AQS实现的工具类,需要明白的就是AQS的state代表的是什么。ReentrantLockReadWriteLock中的state同时表示写锁和读锁的个数。为了实现这种功能,state的高16位表示读锁的个数,低16位表示写锁的个数。AQS有两种模式:共享模式和独占模式,读写锁的实现中,读锁使用共享模式;写锁使用独占模式;另外一点需要记住的即使,当有读锁时,写锁就不能获得;而当有写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁。
读锁,就是加锁的时候看头节点是不是读模式(共享模式),如果是且第一个阻塞的节点不是写模式,如果不是就直接修改state状态,表示加锁成功。如果第一个阻塞节点是写节点,也会接入阻塞加入CLH队列。这样可以防止写进程迟迟获取不到锁。
写锁,独占锁,只要不是自己获取了写锁都阻塞进入CLH队列。