ReadWriteLock 是 JDK 中的讀寫鎖接口
ReentrantReadWriteLock 是 ReadWriteLock 的一種實現
讀寫鎖非常適合讀多寫少的場景。讀寫鎖與互斥鎖的一個重要區別是讀寫鎖允許多個線程同時讀共享變量,這是讀寫鎖在讀多寫少的情況下性能較高的原因。
讀寫鎖的原則:
- 多個線程可同時讀共享變量
- 只允許一個線程寫共享變量
- 寫線程正在執行寫操作,禁止其他線程讀寫共享變量
升級與降級:
- ReadWriteLock 不支持鎖的升級。即線程先獲得讀鎖,再獲取寫鎖,這樣會導致死鎖
- ReadWriteLock 支持鎖的降級。即先獲取寫鎖,再獲取讀鎖,釋放寫鎖,釋放讀鎖
- ReadWriteLock 中只有寫鎖支持條件變量,讀鎖調用 newCondition() 方法,會拋出 UnsupportedOperationException 異常
讀寫鎖的應用示例:
package constxiong.interview; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 測試 讀寫鎖 * @author ConstXiong * @date 2019-12-19 10:40:45 */ public class TestReadWriteLock { final static ReadWriteLock rwLock = new ReentrantReadWriteLock(); final static Lock readLock = rwLock.readLock();//讀鎖 final static Lock writeLock = rwLock.writeLock();//寫鎖 static int count = 0; public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + ":" + get()); }).start(); } for (int i = 0; i < 3; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + " add"); add(); }).start(); } } private static int get() { readLock.lock(); try { return count; } finally { readLock.unlock(); } } private static void add() { writeLock.lock(); try { count++; } finally { writeLock.unlock(); } } }
- Java 自學指南
- Java 面試題匯總PC端瀏覽【點這里】
- Java知識圖譜
- Java 面試題匯總小程序瀏覽,掃二維碼