新聞中心
什么是無(wú)鎖編程
LOCK-FREE,字面解釋就是不通過(guò)鎖來(lái)解決多線程、多進(jìn)程之間的數(shù)據(jù)同步和訪問(wèn)的程序設(shè)計(jì)方案。相對(duì)來(lái)說(shuō)就是通過(guò)數(shù)據(jù)結(jié)構(gòu)和算法來(lái)解決數(shù)據(jù)并發(fā)沖突的實(shí)現(xiàn)方案。

樂(lè)東黎族ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
無(wú)鎖編程的實(shí)現(xiàn)
「比較并交換 Compare-and-swap」
compare and swap,解決多線程并行情況下使用鎖造成性能損耗的一種機(jī)制,CAS操作包含三個(gè)操作數(shù)——內(nèi)存位置(V)、預(yù)期原值(A)和新值(B)。如果內(nèi)存位置的值與預(yù)期原值相匹配,那么處理器會(huì)自動(dòng)將該位置值更新為新值。否則,處理器不做任何操作。無(wú)論哪種情況,它都會(huì)在CAS指令之前返回該位置的值。CAS有效地說(shuō)明了“我認(rèn)為位置V應(yīng)該包含值A(chǔ);如果包含該值,則將B放到這個(gè)位置;否則,不要更改該位置,只告訴我這個(gè)位置現(xiàn)在的值即可。(百度百科)
參考圖
使用場(chǎng)景
(1) 樂(lè)觀鎖的實(shí)現(xiàn)方案:不加鎖,假設(shè)沒(méi)有沖突去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試,直到成功為止。
缺點(diǎn)
(1)循環(huán)開(kāi)銷(xiāo)問(wèn)題。長(zhǎng)時(shí)間更改不成功,會(huì)來(lái)帶大量的CPU消耗。解決方法:需要在修改失敗后執(zhí)行其它邏輯, 且CAS并不適合資源大量競(jìng)爭(zhēng)的情況。
(2)ABA問(wèn)題:線程1準(zhǔn)備用CAS將變量的值由A替換為B,在此之前,線程2將變量的值由A替換為C,又由C替換為A,然后線程1執(zhí)行CAS時(shí)發(fā)現(xiàn)變量的值仍然為A,所以CAS成功。但實(shí)際上這時(shí)的現(xiàn)場(chǎng)已經(jīng)和最初不同了。
「數(shù)據(jù)Hash」
數(shù)據(jù)Hash其實(shí)就是通過(guò)Hash算法把數(shù)據(jù)提前來(lái)確定由哪個(gè)節(jié)點(diǎn)進(jìn)行處理或者存儲(chǔ),解決數(shù)據(jù)并發(fā)的思想是通過(guò)算法解決不同的數(shù)據(jù)到不同的節(jié)點(diǎn)。算法:數(shù)據(jù).hashCode() % 節(jié)點(diǎn)數(shù)量。
參考圖
使用場(chǎng)景
(1)定時(shí)任務(wù)處理數(shù)據(jù)時(shí)。例如:一個(gè)定時(shí)任務(wù)數(shù)據(jù)量較多,需要集群處理。那么就可以同時(shí)啟動(dòng)任務(wù)讀取數(shù)據(jù),然后根據(jù)idHash來(lái)決定當(dāng)前節(jié)點(diǎn)是否要處理這條數(shù)據(jù)。
(2)請(qǐng)求到指定服務(wù)器進(jìn)行處理。例如:Nginx ipHash轉(zhuǎn)發(fā)策略,Kafka hash分區(qū)保證分區(qū)有序性。
缺點(diǎn)
(1) 擴(kuò)容相對(duì)復(fù)雜,需要進(jìn)行數(shù)據(jù)遷移。例如一致性hash算法,Kafka分區(qū)再均衡策略。但是某些場(chǎng)景不一定支持?jǐn)U容。
(2) hash算法是否散列,如果算法不夠散列會(huì)出現(xiàn)數(shù)據(jù)傾斜問(wèn)題。
「單線程」
某些場(chǎng)景下單線程的設(shè)計(jì)要比多線程更加優(yōu)秀, 單線程下不存在資源競(jìng)爭(zhēng)、線程切換,當(dāng)然也取決于你當(dāng)前的服務(wù)器配置。
例如:
(1)Redis的設(shè)計(jì)上,由于內(nèi)存級(jí)別的K/V數(shù)據(jù)庫(kù),在處理核心讀寫(xiě)時(shí)如果頻繁的CPU切換、線程等待喚醒和鎖資源獲取,反倒會(huì)造成性能瓶頸。
(2)在生成分布式id的場(chǎng)景下, 某臺(tái)id服務(wù)器批量生成id 這個(gè)時(shí)候也可以進(jìn)行單線程處理,內(nèi)存計(jì)算非常高效。
什么時(shí)候使用單線程?
(1)單核服務(wù)器。
(2)業(yè)務(wù)場(chǎng)景大量CPU計(jì)算且數(shù)據(jù)沖突較多的情況下(非絕對(duì))。
無(wú)鎖編程的優(yōu)缺點(diǎn)
「優(yōu)點(diǎn)」
不會(huì)有優(yōu)先級(jí)倒置。
不會(huì)出現(xiàn)死鎖、饑餓、餓死等問(wèn)題。
減少資源競(jìng)爭(zhēng),CPU資源消耗少,更高效。
「缺點(diǎn)」
具有一定的復(fù)雜性,需要一定的算法思想。
不適合所以的場(chǎng)景,非全局最優(yōu)解。
總結(jié)
在設(shè)計(jì)程序時(shí), 應(yīng)該考慮程序的使用場(chǎng)景來(lái)進(jìn)行最優(yōu)的數(shù)據(jù)結(jié)構(gòu)和算法來(lái)進(jìn)行方案設(shè)計(jì)。無(wú)鎖編程也只是解決某些場(chǎng)景的一種方案,并不一定代表著最優(yōu)解。
結(jié)語(yǔ)
優(yōu)秀的設(shè)計(jì)模式結(jié)合優(yōu)秀的數(shù)據(jù)結(jié)構(gòu)相才能帶來(lái)優(yōu)秀的代碼。編程人的內(nèi)功心法:數(shù)據(jù)結(jié)構(gòu)+算法。
新聞名稱(chēng):聊聊無(wú)鎖編程設(shè)計(jì)
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/dpdijip.html


咨詢
建站咨詢
