ReadWriteLock讀寫鎖
阿新 • • 發佈:2021-10-30
ReadWriteLock讀寫鎖
-
ReadWriteLock只允許一個執行緒修改,但是get()方法只讀,不修改資料,實際上允許多個執行緒同時呼叫,使用
ReadWriteLock
可以解決這個問題 -
適合讀多寫少的場景
-
原始碼
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
- 實現類:ReentrantReadWriteLock
- 讀鎖(共享鎖),寫鎖(獨佔鎖)
import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; class MyReadWriteLock { public static void main(String[] args) { MyCache myCache = new MyCache(); for (int i = 0; i < 6; i++) { final int temp = i; new Thread(() -> { // lambda無法訪問到外部的變數 myCache.put(temp + "", "value:" + temp); }, String.valueOf(i)).start(); } for (int i = 0; i < 6; i++) { final int temp = i; new Thread(() -> { myCache.get(temp + ""); }, String.valueOf(i)).start(); } } } class MyCache { private final Map<String, Object> map = new HashMap<>(); // 讀寫鎖 private final ReadWriteLock lock = new ReentrantReadWriteLock(); // 只有一個可以寫 public void put(String key, Object value) { lock.writeLock().lock(); try { System.out.println(Thread.currentThread().getName() + "寫入" + value); map.put(key, value); System.out.println(Thread.currentThread().getName() + "寫完畢"); } catch (Exception e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } // 可以多個同時讀 public void get(String key) { lock.readLock().lock(); try { System.out.println(Thread.currentThread().getName() + "讀取" + map.get(key)); System.out.println(Thread.currentThread().getName() + "讀完畢"); } catch (Exception e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } }