7、ReadWriteLock
讀寫鎖:分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥,這是由JVM控制的,我們只要上好相應的鎖即可。
如果你的代碼只讀數據,可以很多人同時讀,但是不能同時寫,那就上讀鎖;如果代碼修改數據,只能一個人在寫,且不能同時讀取,
那就上寫鎖。總之,讀的時候上讀鎖,寫的時候上寫鎖。
?
java.util.concurrent.lock
Interface ReadWriteLock
實現類:
ReentrantReadWriteLock
?
ReadWriteLock實現了兩把鎖,一把只能進行讀操作,一把進行寫操作。讀鎖能夠被多個線程擁有,寫鎖具有排他性。
所有ReadWriteLock的實現必須保證寫鎖操作對于讀鎖操作內存的同步(當然擁有寫鎖時具有排他性,此時只要保證寫操作的內存對讀操作
保持可見性就可以了,當然也就是所謂的同步了)。通俗點說,一個成功獲得讀鎖的線程能夠看到所有先前釋放的寫鎖的更新。
?
讀寫鎖比相互排它鎖支持更大的并發量。它利用的一個事實是:同一時間只能有一個線程對共享數據進行更新,但是可以有多個線程對它進行讀取。
?
讀寫鎖的實現當然要比互斥鎖的實現更難。此時,我們的應用到底是選擇互斥鎖還是讀寫鎖,取決于我們應用讀寫操作發生的頻率。如果讀操作是頻繁
發生的,而寫操作不那么頻繁,那么可以選擇讀寫鎖,這樣會提高應用的性能;反之,如果我們的應用寫操作比較頻繁而讀操作不那么頻繁,并且讀操作
是一些短時間的操作,那么就沒有必要用到讀寫鎖。
?
利用ReentrantReadWriteLock實現緩存:
1 class CachedData { 2 Object data; 3 volatile boolean cacheValid; 4 ReentrantReadWriteLock rwl=new ReentrantReadWriteLock(); 5 6 void processCachedData() { 7 rwl.readLock().lock(); 8 if(!cacheValid) { 9 //在獲得寫鎖之前必須釋放讀鎖 10 rwl.readLock().unlock(); 11 rwl.writeLock().lock(); 12 13 //再次檢測狀態,因為其他線程有可能獲得 14 //寫鎖并且在我們操作之前改變了狀態 15 if(!cacheValid) { 16 //data=....; 17 cacheValid=true; 18 } 19 //在釋放寫鎖之前通過獲得讀鎖進行降級 20 rwl.readLock().lock(); 21 rwl.writeLock().unlock();//釋放寫鎖仍然擁有讀鎖 22 } 23 use(data); 24 rwl.readLock().unlock(); 25 } 26 }?
利用ReentrantReadWriteLock提供集合的并發性能:
1 class RWDictionary { 2 private final Map<String,Data> m=new TreeMap<String,Data>(); 3 private final ReentrantReadWriteLock rwl=new ReentrantReadWriteLock(); 4 private final Lock r=rwl.readLock(); 5 private final Lock w=rwl.writeLock(); 6 7 public Data get(String key) { 8 r.lock(); 9 try { 10 return m.get(key); 11 }finally { 12 r.unlock(); 13 } 14 } 15 16 public String[] allKeys() { 17 r.lock(); 18 try { 19 return (String[])m.keySet().toArray(); 20 }finally { 21 r.unlock(); 22 } 23 } 24 25 public Data put(String key,Data value) { 26 w.lock(); 27 try { 28 return m.put(key, value); 29 }finally { 30 w.unlock(); 31 } 32 } 33 34 public void clear() { 35 w.lock(); 36 try { 37 m.clear(); 38 }finally { 39 w.unlock(); 40 } 41 } 42 }?
轉載于:https://www.cnblogs.com/feijishuo/p/4535027.html
總結
以上是生活随笔為你收集整理的7、ReadWriteLock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何检测过期的统计信息(转)
- 下一篇: 大屏模板制作