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