java多執行緒:併發包中ReentrantReadWriteLock讀寫鎖的鎖降級模板 寫鎖降級為讀鎖
阿新 • • 發佈:2019-02-07
寫鎖降級為讀鎖,但讀鎖不可升級或降級為寫鎖。
鎖降級是為了讓當前執行緒感知到資料的變化。
1 //讀寫鎖 2 private ReentrantReadWriteLock lock=new ReentrantReadWriteLock(); 3 //讀鎖 4 private ReadLock readLock=lock.readLock(); 5 //寫鎖 6 private WriteLock writeLock=lock.writeLock(); 7 private boolean update; 8 9 public void processData(){ 10 //讀鎖獲取 11 readLock.lock();12 13 if(!update){ 14 //必須先釋放讀鎖 15 readLock.unlock(); 16 17 //鎖降級從獲取寫鎖開始 18 writeLock.lock(); 19 try { 20 if(!update){ 21 //準備資料流程(略) 22 update=true; 23 }24 //獲取讀鎖。在寫鎖持有期間獲取讀鎖 25 //此處獲取讀鎖,是為了防止,當釋放寫鎖後,又有一個執行緒T獲取鎖,對資料進行改變,而當前執行緒下面對改變的資料無法感知。 26 //如果獲取了讀鎖,則執行緒T則被阻塞,直到當前執行緒釋放了讀鎖,那個T執行緒才有可能獲取寫鎖。 27 readLock.lock(); 28 }finally{ 29 //釋放寫鎖 30 writeLock.unlock();31 } 32 //鎖降級完成 33 } 34 35 try { 36 //使用資料的流程 37 } finally{ 38 //釋放讀鎖 39 readLock.unlock(); 40 } 41 42 }