乐趣区

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

退出移动版