1. 程式人生 > >java多執行緒:併發包中ReentrantReadWriteLock讀寫鎖的鎖降級模板 寫鎖降級為讀鎖

java多執行緒:併發包中ReentrantReadWriteLock讀寫鎖的鎖降級模板 寫鎖降級為讀鎖

寫鎖降級為讀鎖,但讀鎖不可升級或降級為寫鎖。 鎖降級是為了讓當前執行緒感知到資料的變化。 複製程式碼
 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 }