工作中用到了讀寫鎖,記錄如下:
- 使用場景:多線程中某些代碼塊可以被多個線程同時讀,但是當某塊代碼執行寫操作時,被讀的代碼塊需要變得不可讀,直到寫操作完成
@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
可以看到正常獲取到了讀鎖和寫鎖,如果不按照以上代碼的寫法-不釋放讀鎖而直接獲取寫鎖,會出現死鎖!!!