讀寫鎖使用場景 什么時(shí)候需要分布式鎖?
什么時(shí)候需要分布式鎖?首先,我們需要知道在非分布式環(huán)境中,什么可以用鎖來解決?多線程環(huán)境,共享資源線程安全問題!此時(shí),共享資源通常在一臺機(jī)器的多線程中競爭。從JAVA內(nèi)存模型的角度來看,我們可以通過鎖
什么時(shí)候需要分布式鎖?
首先,我們需要知道在非分布式環(huán)境中,什么可以用鎖來解決?
多線程環(huán)境,共享資源線程安全問題!此時(shí),共享資源通常在一臺機(jī)器的多線程中競爭。從JAVA內(nèi)存模型的角度來看,我們可以通過鎖定對象、方法和代碼塊來避免共享資源的競爭
!1,生成全局ID;
2,修改全局配置文件;
3,分布式服務(wù)中的seckill;
4,分布式環(huán)境中的重復(fù)提交;
1,使用數(shù)據(jù)庫的唯一主鍵實(shí)現(xiàn)鎖定
!2、使用redis指令:通常使用setnx方法,incr方法實(shí)現(xiàn)
3、使用zookeeper:使用API生成臨時(shí)節(jié)點(diǎn)實(shí)現(xiàn)鎖定
讀鎖和寫鎖區(qū)別?
共享鎖也稱為讀鎖。如果事務(wù)t將s鎖添加到數(shù)據(jù)對象a,則事務(wù)t可以讀取a,但不能修改a。其他事務(wù)只能將s鎖添加到a,而不能添加x鎖,直到t釋放a上的s鎖。這確保了其他事務(wù)可以讀取a,但在t釋放a上的s鎖之前,t不能對a進(jìn)行任何更改。
獨(dú)占鎖(x鎖)也稱為寫入鎖上。如果事務(wù)t對數(shù)據(jù)對象a應(yīng)用x鎖,則事務(wù)t可以讀取a或修改a。在事務(wù)t釋放對a的鎖之前,其他事務(wù)不能對a應(yīng)用任何鎖。這將確保在事務(wù)t釋放對a的鎖之前,其他事務(wù)不能再讀取和修改a
請記住,您可以編寫程序,就像找到一個(gè)固定的詞。我只是不記得了。人們真的很蠢。
給你一個(gè)含有1億個(gè)QQ號碼的文件,如何快速的查找某個(gè)QQ號碼?
下面簡要說明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一來解釋它??聪旅鎯蓚€(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問題上來,只有一個(gè)線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對這個(gè)變量進(jìn)行寫,到底要不要加鎖?
看來沒人能說到點(diǎn)子上。讓我簡單地說一下:raid中有一個(gè)很大的問題,叫做write hole,就是寫文件時(shí)突然斷電,文件沒有完成,檢查代碼是基于整個(gè)文件的。所有級別的raid都有此問題。對于raid5,這個(gè)問題尤其嚴(yán)重,因?yàn)楫?dāng)出現(xiàn)問題時(shí),系統(tǒng)并不知道有問題。直到一個(gè)磁盤完全損壞,您用一個(gè)新磁盤替換它,RAID系統(tǒng)重新構(gòu)建,您會發(fā)現(xiàn)檢查代碼和文件內(nèi)容是不同的。
更好的硬件raid卡,采用多種方法避免突然掉電,什么小電池啊,NVRAM啊等等。
軟件RAID根本沒有此功能。至于家庭NAS或服務(wù)器,很少有ups。另外,有些人有隨意關(guān)機(jī)的習(xí)慣,所以更容易帶來寫洞。平時(shí)我什么也感覺不到。出了什么事哭都來不及了。這也是軟件RAID使用越來越少的事實(shí)。在正式應(yīng)用中,沒有軟件RAID。
如果您真的想使用soft,您必須使用ZFS或其他東西。ZFS采用raid-z的軟件方法來解決寫孔問題。這種方法稱為寫時(shí)復(fù)制。Raid-z與Raid-5類似,但它不是Raid本身,更不是軟件Raid。由于copy-on-write,ZFS可以隨時(shí)檢查和更正檢查代碼。代價(jià)是ZFS需要大量的內(nèi)存和計(jì)算。