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