ReentrantReadWriteLock中鎖降級的理解


《Java 並發編程的藝術》中關於鎖降級的說明:

鎖降級中讀鎖的獲取是否必要呢?

答案是必要的。主要是為了保證數據的可見性,如果當前線程不獲取讀鎖而是直接釋放寫鎖, 假設此刻另一個線程(記作線程T)獲取了寫鎖並修改了數據,那么當前線程無法感知線程T的數據更新。如果當前線程獲取讀鎖,即遵循鎖降級的步驟,則線程T將會被阻塞,直到當前線程使用數據並釋放讀鎖之后,線程T才能獲取寫鎖進行數據更新。

 

保證數據的可見性可以這樣理解:假設線程A修改了數據,釋放了寫鎖,這個時候線程T獲得了寫鎖,修改了數據,然后也釋放了寫鎖,線程A讀取數據的時候,讀到的是線程T修改的,並不是線程A自己修改的,那么在使用修改后的數據時,就會忽略線程A之前的修改結果。書上說的【當前線程無法感知線程T的數據更新】,是說線程A使用數據時,並不知道別的線程已經更改了數據,所以使用的是線程T的修改結果。因此通過鎖降級來保證數據每次修改后的可見性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM