因此 , 只有等待其他读线程都释放了读锁 , 写锁才能被当前线程获取 , 而写锁一旦被获取 , 则其他读写线程的后续访问均被阻塞 。写锁的释放与ReentrantLock的释放过程基本类似 , 每次释放均减少写状态 , 当写状态为0时表示写锁已被释放 , 然后等待的读写线程才能够继续访问读写锁 , 同时前次写线程的修改对后续的读写线程可见 。
接着是读锁的代码:
文章插图
可以看到在tryAcquireShared(int unused)方法中 , 如果其他线程已经获取了写锁 , 则当前线程获取读锁失败 , 进入等待状态 。如果当前线程获取了写锁或者写锁未被获取 , 则当前线程(线程安全 , 依靠CAS保证)增加读状态 , 成功获取读锁 。读锁的每次释放(线程安全的 , 可能有多个读线程同时释放读锁)均减少读状态 , 减少的值是“1<<16” 。所以读写锁才能实现读读的过程共享 , 而读写、写读、写写的过程互斥 。
此时 , 我们再回头看一下互斥锁ReentrantLock中公平锁和非公平锁的加锁源码:
文章插图
我们发现在ReentrantLock虽然有公平锁和非公平锁两种 , 但是它们添加的都是独享锁 。根据源码所示 , 当某一个线程调用lock方法获取锁时 , 如果同步资源没有被其他线程锁住 , 那么当前线程在使用CAS更新state成功后就会成功抢占该资源 。而如果公共资源被占用且不是被当前线程占用 , 那么就会加锁失败 。所以可以确定ReentrantLock无论读操作还是写操作 , 添加的锁都是都是独享锁 。
推荐阅读
- Java虚拟机:Jvm概念和原理详解以及GC机制的分析
- Java|聊聊写简历的那些坑,为什么你投出去的简历总是石沉大海!
- 换一个卧室门锁大概多少钱,卧室门锁芯怎么换
- java 泛型详解
- WiFi系统的无线AP与AC之间的各种问题解析
- 吴裕泰连锁茶餐厅,品味精致茶文化菜肴
- 春吃芽,各种芽的功效大不同,你知道这其中的奥秘吗?
- 茶是毒素解药 不同人群喝不同的茶
- 电子驻车很多车上都有,带你解锁它的隐藏功能,别到卖车还不知道
- 肉苁蓉锁阳泡茶的方法是什么