java 降級鎖的理解

原文:https://blog.csdn.net/qiuwenjie123/article/details/79950532 

讀寫鎖是什麼我就不多說了,下面說什麼是鎖降級

 

鎖降級:

鎖降級指的是寫鎖降級成爲讀鎖。如果當前線程擁有寫鎖,然後將其釋放,最後再獲取讀鎖,這種分段完成的過程不能稱之爲鎖降級。鎖降級是指把持住(當前擁有的)寫鎖,再獲取到讀鎖,隨後釋放(先前擁有的)寫鎖的過程。

 

鎖降級的必要性:

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

 

這裏要着重講一講“無法感知”是什麼意思:

也就是說,在另一個線程(假設叫線程1)修改數據的那一個瞬間,當前線程(線程2)是不知道數據此時已經變化了,但是並不意味着之後線程2使用的數據就是舊的數據,相反線程2使用還是被線程1更新之後的數據。也就是說,就算我不使用鎖降級,程序的運行結果也是正確的(這是因爲鎖的機制和volatile關鍵字相似)。

那麼爲什麼還要鎖降級呢,其實目的是爲了減少線程的阻塞喚醒。明顯當不使用鎖降級,線程2修改數據時,線程1自然要被阻塞,而使用鎖降級時則不會。“感知”其實是想強調讀的實時連續性,但是卻容易讓人誤導爲強調數據操作。

 

一些優秀的回答:

首先你沒理解讀寫鎖的意義,讀鎖的存在意味着不允許其他寫操作的存在。
按照你提供的例子,可能存在一個事務線程不希望自己的操作被別的線程中斷,而這個事務操作可能分成多部分操作更新不同的數據(或表)甚至非常耗時。如果長時間用寫鎖獨佔,顯然對於某些高響應的應用是不允許的,所以在完成部分寫操作後,退而使用讀鎖降級,來允許響應其他進程的讀操作。只有當全部事務完成後才真正釋放鎖。
按你的理解如果當中寫鎖被其他線程佔用,那麼這個事務線程將不得不中斷等待別的寫鎖釋放。

 

 

所以總結下鎖降級的意義應該就是:在一邊讀一邊寫的情況下提高性能。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章