您好,登錄后才能下訂單哦!
歡×××”,查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。
(手機(jī)橫屏看源碼更方便)
同步系列到此就結(jié)束了,本篇文章對(duì)同步系列做一個(gè)總結(jié)。
下面是關(guān)于同步系列的一份腦圖,列舉了主要的知識(shí)點(diǎn)和問(wèn)題點(diǎn),看過(guò)本系列文章的同學(xué)可以根據(jù)腦圖自行回顧所學(xué)的內(nèi)容,也可以作為面試前的準(zhǔn)備。
如果有需要原圖的同學(xué),可×××哥讀源碼”,回復(fù)“sync”領(lǐng)取。
所謂同步,就是保證多線程(包括多進(jìn)程)對(duì)共享資源的讀寫(xiě)能夠安全有效的運(yùn)行。
根據(jù)同步的運(yùn)用場(chǎng)景的不同,實(shí)現(xiàn)同步的方式也是隨之一起變化,但是總結(jié)下來(lái),這些實(shí)現(xiàn)方式之間又有一些共通之處。
不管是互斥鎖、讀寫(xiě)鎖、信號(hào)量、CountDownLatch、回環(huán)柵欄、Phaser,還是各種分布式鎖,它們都是基于對(duì)同一個(gè)共享變量(狀態(tài)變量)的控制,以達(dá)到同步的目的。
互斥鎖,state為大于等于1(可重入)表示已加鎖,state為0表示未加鎖;
讀寫(xiě)鎖,state的高16位存儲(chǔ)讀的次數(shù),本文由公從號(hào)“彤哥讀源碼”原創(chuàng),低16位存儲(chǔ)寫(xiě)的次數(shù);
信號(hào)量,state存儲(chǔ)許可的次數(shù),被使用一次許可減一,被釋放一次許可加一;
CountDownLatch,state存儲(chǔ)初始次數(shù),countDown()次數(shù)減一,當(dāng)次數(shù)減為0的時(shí)候await()被激活;
回環(huán)柵欄,基于ReentrantLock實(shí)現(xiàn),相當(dāng)于在CountDownLatch的基礎(chǔ)上加了“代”的概念,保證可重復(fù)使用;
Phaser,state的高32位存儲(chǔ)當(dāng)前階段phase,中16位存儲(chǔ)當(dāng)前階段參與者(任務(wù))的數(shù)量parties,低16位存儲(chǔ)未完成參與者的數(shù)量unarrived,每個(gè)階段的參與者都可以控制,相對(duì)于回環(huán)柵欄更靈活;
mysql分布式鎖,基于數(shù)據(jù)庫(kù)的get_lock()/release_lock()對(duì)共享變量進(jìn)行控制;
zookeeper分布式鎖,基于有序臨時(shí)節(jié)點(diǎn)對(duì)共享變量進(jìn)行控制;
redis分布式鎖,基于內(nèi)存鍵值對(duì)對(duì)共享變量進(jìn)行控制;
總結(jié)下來(lái),所有同步器的關(guān)鍵因素只有一個(gè)——共享變量,只要能夠?qū)蚕碜兞窟M(jìn)行精確的控制,就能實(shí)現(xiàn)同步,以后出現(xiàn)新的組件我們一樣可以根據(jù)這條原理使用新的組件來(lái)實(shí)現(xiàn)分布式同步器。
下一個(gè)系列我們將學(xué)習(xí)線程(池)相關(guān)的知識(shí)點(diǎn),敬請(qǐng)期待!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。