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