当前位置: 首页 > 后端技术 > Java

JUC的六次锁降级

时间:2023-04-01 18:01:51 Java

锁降级是指写锁降级为读锁。锁降级就是当前拥有写锁,然后获取读锁,再释放写锁的过程。需要注意的是写锁并不是在开始使用写后立即释放,而是在获取到读锁后释放。这是一个例子:publicclassReadWriteLockTest{privateReadWriteLockreadWriteLock=newReentrantReadWriteLock();私有锁writeLock=readWriteLock.writeLock();私有锁readLock=readWriteLock.readLock();privatevolatileboolean/**锁降级*;publicvoidtest(){readLock.lock();if(!updateFlag){readLock.unlock();//一定要在获取写锁之前释放读锁。如果直接获取写锁,当前线程会阻塞writeLock.lock();//step1,获取写锁try{if(!updateFlag){//修改数据逻辑,省略。更新标志=真;}readLock.lock();//step2,获取读锁并排斥其他写锁修改数据}finally{writeLock.unlock();//step3,释放写锁。至此,锁降级完成}}try{//如果step2没有先获取到读锁,其他线程会在step3释放写锁后修改数据,//会导致在下面的'readdata中读取数据logic'走题不准确//读数据逻辑,略。}finally{readLock.unlock();step4}}}需要注意的是,ReentrantReadWriteLock不支持锁升级,即持有读锁,立即获取写锁,不释放。这会导致当前线程在获取写锁时阻塞,读锁也被释放。锁降级的使用场景:线程修改后需要立即读取相同的数据但不希望其他线程修改。为什么不直接在写锁中读取数据呢?写锁和其他锁是互斥的,而读锁可以和其他读锁共享,这样可以减少其他读操作的等待时间,也就是把互斥的范围降到最低。参考文章:《Java并发编程的艺术》