java读写锁降级_java的读写锁中锁降级的问题
讀寫鎖是什么我就不多說了,下面說什么是鎖降級
鎖降級:
鎖降級指的是寫鎖降級成為讀鎖。如果當前線程擁有寫鎖,然后將其釋放,最后再獲取讀鎖,這種分段完成的過程不能稱之為鎖降級。鎖降級是指把持住(當前擁有的)寫鎖,再獲取到讀鎖,隨后釋放(先前擁有的)寫鎖的過程。
鎖降級的必要性:
鎖降級中讀鎖的獲取是否必要呢?答案是必要的。主要是為了保證數據的可見性,如果當前線程不獲取讀鎖而是直接釋放寫鎖, 假設此刻另一個線程(記作線程T)獲取了寫鎖并修改了數據,那么當前線程無法感知線程T的數據更新。如果當前線程獲取讀鎖,即遵循鎖降級的步驟,則線程T將會被阻塞,直到當前線程使用數據并釋放讀鎖之后,線程T才能獲取寫鎖進行數據更新。
這里要著重講一講“無法感知”是什么意思:
也就是說,在另一個線程(假設叫線程1)修改數據的那一個瞬間,當前線程(線程2)是不知道數據此時已經變化了,但是并不意味著之后線程2使用的數據就是舊的數據,相反線程2使用還是被線程1更新之后的數據。也就是說,就算我不使用鎖降級,程序的運行結果也是正確的(這是因為鎖的機制和volatile關鍵字相似)。
那么為什么還要鎖降級呢,其實目的是為了減少線程的阻塞喚醒。明顯當不使用鎖降級,線程2修改數據時,線程1自然要被阻塞,而使用鎖降級時則不會。“感知”其實是想強調讀的實時連續性,但是卻容易讓人誤導為強調數據操作。
一些優秀的回答:
首先你沒理解讀寫鎖的意義,讀鎖的存在意味著不允許其他寫操作的存在。
按照你提供的例子,可能存在一個事務線程不希望自己的操作被別的線程中斷,而這個事務操作可能分成多部分操作更新不同的數據(或表)甚至非常耗時。如果長時間用寫鎖獨占,顯然對于某些高響應的應用是不允許的,所以在完成部分寫操作后,退而使用讀鎖降級,來允許響應其他進程的讀操作。只有當全部事務完成后才真正釋放鎖。
按你的理解如果當中寫鎖被其他線程占用,那么這個事務線程將不得不中斷等待別的寫鎖釋放。
所以總結下鎖降級的意義應該就是:在一邊讀一邊寫的情況下提高性能。
有興趣的可以參考下面的鏈接:
總結
以上是生活随笔為你收集整理的java读写锁降级_java的读写锁中锁降级的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的默认_java默认包的使用
- 下一篇: java中script类_在Script