10、JUC--ReadWriteLock 讀寫鎖
阿新 • • 發佈:2019-05-02
同時 更新 -- 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 讀寫鎖