1. 程式人生 > 其它 >讀寫鎖,介面ReadWriteLock,實現類ReentrantReadWriteLock

讀寫鎖,介面ReadWriteLock,實現類ReentrantReadWriteLock

技術標籤:# JUC

讀寫鎖演示
    /**
     * 獨佔鎖(寫入)  一次只能被一個執行緒佔有
     * 共享鎖(讀取)  多個執行緒可以同時佔有
     * =================================
     * 讀寫鎖
     * 讀和讀  可以共存
     * 讀和寫  不可以共存
     * 寫和寫  不可以共存
     *
     */
    public static void main(String[] args) {
        ReadWrite readWrite = new ReadWrite();
        for
(int i = 1; i <= 5; i++) { final int temp = i; new Thread(() -> { // 寫入操作 readWrite.write(temp + "", temp + ""); }, String.valueOf(i)).start(); } for (int i = 1; i <= 5; i++) { /
//////////////// final int temp = i; new Thread(() -> { // 寫入操作 readWrite.read(temp + ""); }, String.valueOf(i)).start(); } } } // 資源類 class ReadWrite { private volatile Map<String, Object> map = new HashMap<>
(); // 讀寫鎖 private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 寫入,同時只能有一個執行緒寫,不能插隊,保證原子性 public void write(String key, Object value) { // 加鎖 readWriteLock.writeLock().lock(); // 業務邏輯 try { System.out.println(Thread.currentThread().getName() + "開始寫入"); map.put(key, value); System.out.println(Thread.currentThread().getName() + "寫入完成"); }catch (Exception e) { e.printStackTrace(); }finally { // 解鎖 readWriteLock.writeLock().unlock(); } } // 讀出,可以同時讓所有執行緒讀 public void read(String key) { // 加鎖 readWriteLock.readLock().lock(); // 業務邏輯 try { System.out.println(Thread.currentThread().getName() + "開始讀"); Object o = map.get(key); System.out.println(Thread.currentThread().getName() + "讀完成"); }catch (Exception e) { e.printStackTrace(); }finally { // 解鎖 readWriteLock.readLock().unlock(); } } }

在這裡插入圖片描述