JAVA里的锁之五锁降级
锁降级指的是写锁降级为读锁。
锁降级是当前拥用写锁,再获取读锁,随后释放写锁的过程。需要注意的是开始拥用写后并没有立即释放写锁,而是在获取了读锁后才释放。
下面是一个示例:
public class ReadWriteLockTest {private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock writeLock = readWriteLock.writeLock();
private Lock readLock = readWriteLock.readLock();
private volatile boolean updateFlag;
/**锁降级*/
public void test(){
readLock.lock();
if(!updateFlag){
readLock.unlock();
//一定要先释放了读锁再去获取写锁,如果直接获取写锁,当前线程会被阻塞
writeLock.lock();
//step1,获取写锁
try {
if(!updateFlag){
//修改数据逻辑,略。
updateFlag = true;
}
readLock.lock();
//step2,获取读锁,排斥其它写锁修改数据
}finally {
writeLock.unlock();
//step3,释放写锁。到这里,锁降级完成
}
}
try {
//如果step2不先获取读锁,在step3释放了写锁后其它线程会对数据进行修改,
//会使得下面‘读取数据逻辑’里出现数据读取不准确的问题//读取数据逻辑,略。
}finally {
readLock.unlock();
step4
}
}
}
需要注意的是ReentrantReadWriteLock不支持锁升级,也就是持用读锁,在不释放的情形下立即获取写锁。这会导致当前线程一直阻塞在写锁的获取上,而读锁也释放来了。
【JAVA里的锁之五锁降级】参考文章:《Java并发编程的艺术》
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量