同步系列到此就結束了,本篇文章對同步系列作一個總結。java
下面是關於同步系列的一份腦圖,列舉了主要的知識點和問題點,看過本系列文章的同窗能夠根據腦圖自行回顧所學的內容,也能夠做爲面試前的準備。mysql
若是有須要高清無碼原圖的同窗,能夠關注公衆號「彤哥讀源碼」,回覆「sync」領取。面試
所謂同步,就是保證多線程(包括多進程)對共享資源的讀寫可以安全有效的運行。redis
根據同步的運用場景的不一樣,實現同步的方式也是隨之一塊兒變化,可是總結下來,這些實現方式之間又有一些共通之處。sql
無論是互斥鎖、讀寫鎖、信號量、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分佈式鎖,基於內存鍵值對對共享變量進行控制;
總結下來,全部同步器的關鍵因素只有一個——共享變量,只要可以對共享變量進行精確的控制,就能實現同步,之後出現新的組件咱們同樣能夠根據這條原理使用新的組件來實現分佈式同步器。
下一個系列咱們將學習線程(池)相關的知識點,敬請期待!
三、死磕 java同步系列之JMM(Java Memory Model)
八、死磕 java同步系列之ReentrantLock源碼解析(一)——公平鎖、非公平鎖
九、死磕 java同步系列之ReentrantLock源碼解析(二)——條件鎖
十、死磕 java同步系列之ReentrantLock VS synchronized
十一、死磕 java同步系列之ReentrantReadWriteLock源碼解析
1三、死磕 java同步系列之CountDownLatch源碼解析
1五、死磕 java同步系列之StampedLock源碼解析
1六、死磕 java同步系列之CyclicBarrier源碼解析
歡迎關注個人公衆號「彤哥讀源碼」,查看更多源碼系列文章, 與彤哥一塊兒暢遊源碼的海洋。