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并发编程的艺术》

    推荐阅读