Java|锁--JAVA成长之路( 八 )


接着是读锁的代码:
可以看到在tryAcquireShared(int unused)方法中 , 如果其他线程已经获取了写锁 , 则当前线程获取读锁失败 , 进入等待状态 。 如果当前线程获取了写锁或者写锁未被获取 , 则当前线程(线程安全 , 依靠CAS保证)增加读状态 , 成功获取读锁 。 读锁的每次释放(线程安全的 , 可能有多个读线程同时释放读锁)均减少读状态 , 减少的值是“1<<16” 。 所以读写锁才能实现读读的过程共享 , 而读写、写读、写写的过程互斥 。
此时 , 我们再回头看一下互斥锁ReentrantLock中公平锁和非公平锁的加锁源码:
我们发现在ReentrantLock虽然有公平锁和非公平锁两种 , 但是它们添加的都是独享锁 。 根据源码所示 , 当某一个线程调用lock方法获取锁时 , 如果同步资源没有被其他线程锁住 , 那么当前线程在使用CAS更新state成功后就会成功抢占该资源 。 而如果公共资源被占用且不是被当前线程占用 , 那么就会加锁失败 。 所以可以确定ReentrantLock无论读操作还是写操作 , 添加的锁都是都是独享锁 。