锁降级指的是写锁降级为读锁。
锁降级是以后拥用写锁,再获取读锁,随后开释写锁的过程。须要留神的是开始拥用写后并没有立刻开释写锁,而是在获取了读锁后才开释。
上面是一个示例:
<code class="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并发编程的艺术》