1. 程式人生 > >10、JUC--ReadWriteLock 讀寫鎖

10、JUC--ReadWriteLock 讀寫鎖

同時 更新 -- try 數據安全 並發 all 其中 runnable

讀-寫鎖 ReadWriteLock

? ReadWriteLock 維護了一對相關的鎖,一個用於只讀操作,
  另一個用於寫入操作。只要沒有 writer,讀取鎖可以由
  多個 reader 線程同時保持。寫入鎖是獨占的。。
? ReadWriteLock 讀取操作通常不會改變共享資源,但執行
  寫入操作時,必須獨占方式來獲取鎖。對於讀取操作占
  多數的數據結構。 ReadWriteLock 能提供比獨占鎖更高
  的並發性。而對於只讀的數據結構,其中包含的不變性
  可以完全不需要考慮加鎖操作。

ReadWriteLock讀寫鎖

  寫寫/讀寫 需要互斥

  讀讀 不需要互斥

讀寫操作類

class readWriteLock{
    
    private int num = 0;
    
    //
    public void get(){
        System.out.println(Thread.currentThread().getName() +":" + num);
    }
    
    //
    public void set(int num){
        this.num = num;
    }
}

如果線程過多,此時讀寫同時操作

線程是不安全的

此時可以使用ReadWriterLock

進行讀寫操作

更新上述的代碼:

class readWriteLock{
    private int num = 0;
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    //
    public void get(){
        //讀上鎖
        lock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() +"讀:" + num);
        } 
finally { //讀解鎖 lock.readLock().unlock(); } } // public void set(int num){ lock.writeLock().lock(); try { this.num = num; System.out.println(Thread.currentThread().getName()+"寫:" + this.num); } finally { lock.writeLock().unlock(); } } }

測試類中:

public static void main(String[] args) {
        readWriteLock rw = new readWriteLock();
        
        
        for(int i =0;i<=20;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    rw.set(new Random().nextInt());
                }
            }).start();
        }
        
        //
        for(int i =0;i<=20;i++){
                new Thread(new Runnable() {
                @Override
                 public void run() {
                     rw.get();
                }
            }).start();
        }
    }

測試結果:

Thread-4寫:1380172948
Thread-10寫:-1691293863
Thread-9寫:-1957720735
Thread-3寫:-18260563
Thread-5寫:-1708073724
Thread-2寫:-133847467
Thread-0寫:-693555311
Thread-8寫:855677820
Thread-1寫:1224645831
Thread-6寫:2059526025
Thread-7寫:-1898498753
Thread-11寫:1837102721
Thread-13寫:-1025259351
Thread-14寫:1964685852
Thread-15寫:483772746
Thread-17寫:-1091825320
Thread-18寫:1416338338
Thread-16寫:-2079049313
Thread-20寫:1405392687
Thread-22讀:1405392687
Thread-21讀:1405392687
Thread-24讀:1405392687
Thread-23讀:1405392687
Thread-12寫:1343396814
Thread-25讀:1343396814
Thread-26讀:1343396814
Thread-28讀:1343396814
Thread-27讀:1343396814
Thread-29讀:1343396814
Thread-30讀:1343396814
Thread-32讀:1343396814
Thread-31讀:1343396814
Thread-19寫:-1883309938
Thread-33讀:-1883309938
Thread-35讀:-1883309938
Thread-34讀:-1883309938
Thread-36讀:-1883309938
Thread-39讀:-1883309938
Thread-37讀:-1883309938
Thread-38讀:-1883309938
Thread-40讀:-1883309938
Thread-41讀:-1883309938

此時不會出現共享數據安全性的問題

10、JUC--ReadWriteLock 讀寫鎖