《Java 並發編程的藝術》中關於鎖降級的說明:
鎖降級中讀鎖的獲取是否必要呢?
答案是必要的。主要是為了保證數據的可見性,如果當前線程不獲取讀鎖而是直接釋放寫鎖, 假設此刻另一個線程(記作線程T)獲取了寫鎖並修改了數據,那么當前線程無法感知線程T的數據更新。如果當前線程獲取讀鎖,即遵循鎖降級的步驟,則線程T將會被阻塞,直到當前線程使用數據並釋放讀鎖之后,線程T才能獲取寫鎖進行數據更新。
保證數據的可見性可以這樣理解:假設線程A修改了數據,釋放了寫鎖,這個時候線程T獲得了寫鎖,修改了數據,然后也釋放了寫鎖,線程A讀取數據的時候,讀到的是線程T修改的,並不是線程A自己修改的,那么在使用修改后的數據時,就會忽略線程A之前的修改結果。書上說的【當前線程無法感知線程T的數據更新】,是說線程A使用數據時,並不知道別的線程已經更改了數據,所以使用的是線程T的修改結果。因此通過鎖降級來保證數據每次修改后的可見性。