Java中的讀寫鎖ReadWriteLock


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();
        }
    }
    
}

 


原文鏈接
 


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM