死磕 java同步系列之終結篇
- 2019 年 10 月 5 日
- 筆記
簡介
同步系列到此就結束了,本篇文章對同步系列做一個總結。
腦圖
下面是關於同步系列的一份腦圖,列舉了主要的知識點和問題點,看過本系列文章的同學可以根據腦圖自行回顧所學的內容,也可以作為面試前的準備。
如果有需要高清無碼原圖的同學,可以關注公眾號「彤哥讀源碼」,回復「sync」領取。
總結
所謂同步,就是保證多執行緒(包括多進程)對共享資源的讀寫能夠安全有效的運行。
根據同步的運用場景的不同,實現同步的方式也是隨之一起變化,但是總結下來,這些實現方式之間又有一些共通之處。
不管是互斥鎖、讀寫鎖、訊號量、CountDownLatch、迴環柵欄、Phaser,還是各種分散式鎖,它們都是基於對同一個共享變數(狀態變數)的控制,以達到同步的目的。
互斥鎖,state為大於等於1(可重入)表示已加鎖,state為0表示未加鎖;
讀寫鎖,state的高16位存儲讀的次數【本篇文章由公眾號「彤哥讀源碼」原創】,低16位存儲寫的次數;
訊號量,state存儲許可的次數,被使用一次許可減一,被釋放一次許可加一;
CountDownLatch,state存儲初始次數,countDown()次數減一,當次數減為0的時候await()被激活;
迴環柵欄,基於ReentrantLock實現,相當於在CountDownLatch的基礎上加了「代」的概念,保證可重複使用;
Phaser,state的高32位存儲當前階段phase,中16位存儲當前階段參與者(任務)的數量parties,低16位存儲未完成參與者的數量unarrived,每個階段的參與者都可以控制,相對於迴環柵欄更靈活;
mysql分散式鎖,基於資料庫的get_lock()/release_lock()對共享變數進行控制;
zookeeper分散式鎖,基於有序臨時節點對共享變數進行控制;
redis分散式鎖,基於記憶體鍵值對對共享變數進行控制;
總結下來,所有同步器的關鍵因素只有一個——共享變數,只要能夠對共享變數進行精確的控制,就能實現同步,以後出現新的組件我們一樣可以根據這條原理使用新的組件來實現分散式同步器。
彩蛋
下一個系列我們將學習執行緒(池)相關的知識點,敬請期待!
推薦閱讀
3、死磕 java同步系列之JMM(Java Memory Model)
8、死磕 java同步系列之ReentrantLock源碼解析(一)——公平鎖、非公平鎖
9、死磕 java同步系列之ReentrantLock源碼解析(二)——條件鎖
10、死磕 java同步系列之ReentrantLock VS synchronized
11、死磕 java同步系列之ReentrantReadWriteLock源碼解析
13、死磕 java同步系列之CountDownLatch源碼解析
15、死磕 java同步系列之StampedLock源碼解析
16、死磕 java同步系列之CyclicBarrier源碼解析
歡迎關注我的公眾號「彤哥讀源碼」,查看更多源碼系列文章, 與彤哥一起暢遊源碼的海洋。