讀寫鎖

工作中用到了讀寫鎖,記錄如下:

  • 使用場景:多線程中某些代碼塊可以被多個線程同時讀,但是當某塊代碼執行寫操作時,被讀的代碼塊需要變得不可讀,直到寫操作完成
@Test
public void testReadAndWriteLock() {
    ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    // 獲取讀鎖
    readWriteLock.readLock().lock();
    try {
        // 執行讀鎖中的業務邏輯
        System.out.println("read lock");
        try {
            // 獲取寫鎖之前要先釋放讀鎖,否則會導致讀鎖和寫鎖之間的死鎖
            readWriteLock.readLock().unlock();
            // 獲取寫鎖
            readWriteLock.writeLock().lock();
            // 執行寫鎖中的業務邏輯
            System.out.println("write lock");
            // 執行完寫鎖中的業務邏輯後再把讀鎖鎖上,否則finally中的釋放讀鎖會出異常
            readWriteLock.readLock().lock();
        } finally {
            // 釋放寫鎖
            readWriteLock.writeLock().unlock();
        }
    } finally {
        // 釋放讀鎖
        readWriteLock.readLock().unlock();
    }
}

運行結果如下:

↓...start test...↓
read lock
write lock
↑...end test...↑

Process finished with exit code 0

可以看到正常獲取到了讀鎖和寫鎖,如果不按照以上代碼的寫法-不釋放讀鎖而直接獲取寫鎖,會出現死鎖!!!

發佈了27 篇原創文章 · 獲贊 22 · 訪問量 5735
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章