同步系列,這是彤哥想了很久的名字,原本是準備寫鎖相關的內容,可是java中的CountDownLatch、Semaphore、CyclicBarrier這些類又不屬於鎖,它們和鎖又有不少共同點,都是爲了協同多線程的執行,都是一種同步器,因此這裏就借用同步來取名字了,也就是「同步系列」的來源。java
這一篇的內容會比較多,大體包含三大主題:java中的鎖、同步器、分佈式鎖,大體講的內容以下:sql
(1)volatile數組
(2)synchronized多線程
(3)AQS及Condition併發
(4)ReentrantLock分佈式
(5)ReentrantReadWriteLock性能
(6)StampedLock學習
(7)CountDownLatch優化
(8)Semaphore線程
(9)CyclicBarrier
(10)Phaser
(11)Mysql實現分佈式鎖
(12)Redis實現分佈式鎖
(13)Zookeeper實現分佈鎖
這些內容都比較晦澀難懂,網上也有比較多的資料,但每每講得不夠透徹,彤哥會盡可能用通俗易懂的語言把這些問題講清楚。
關於鎖的名詞也有不少,彤哥大體整理了下,所有列到這裏:
(1)公平鎖/非公平鎖
公平鎖,是指按照線程申請的順序獲取鎖。
非公平鎖,是指不是按照線程申請的順序獲取鎖,有可能後申請的線程反而先獲取到鎖,假如先來的線程一直獲取不到鎖,會形成鎖飢餓現象。
ReentrantLock中能夠經過構造方法指定是否爲公平鎖,默認爲非公平鎖,非公平鎖的優勢在於吞吐量大。
synchronized沒法指定爲公平鎖,一直都是非公平鎖。
(2)可重入鎖
可重入鎖,是指一個線程獲取鎖以後再嘗試獲取鎖時會自動獲取鎖,可重入鎖的優勢是避免死鎖。
ReentrantLock和synchronized都是可重入鎖。
(3)獨享鎖/共享鎖
獨享鎖,是指鎖一次只能被一個線程持有。
共享鎖,是指鎖一次能夠被多個線程持有。
ReentrantLock和synchronized都是獨享鎖,ReadWriteLock的讀鎖是共享鎖,寫鎖是獨享鎖。
(4)互斥鎖/讀寫鎖
與獨享鎖/共享鎖的概念差很少,是獨享鎖/共享鎖的具體實現。
ReentrantLock和synchronized都是互斥鎖
ReadWriteLock是讀寫鎖
(5)樂觀鎖/悲觀鎖
悲觀鎖,是指認爲對於同一個數據的併發操做必然會發生修改,即便不會發生修改也這麼認爲,因此必定要加鎖。
樂觀鎖,是指認爲對於同一個數據的併發操做不必定會發生修改,在更新數據的時候,嘗試去更新數據,若是失敗就不斷嘗試。
悲觀鎖適用於寫操做多的場景,樂觀鎖適用於讀操做多的場景。
(6)分段鎖
分段鎖,是一種鎖的設計思路,它細化了鎖的粒度,主要運用在ConcurrentHashMap中,實現高效的併發操做,當操做不須要更新整個數組時,就只鎖數組中的一項就能夠了。
(7)偏向鎖/輕量級鎖/重量級鎖
這三個鎖主要是針對synchronized進行優化使用的,主要是經過對象監視器在對象頭中的字段來代表的。
偏向鎖,是指一段同步代碼一直被一個線程訪問,那麼這個線程會自動獲取鎖,下降獲取鎖的代價。
輕量級鎖,是指當鎖是偏向鎖時,被另外一個線程所訪問,偏向鎖會升級爲輕量級鎖,這個線程會經過自旋的方式嘗試獲取鎖,不會阻塞,提升性能。
重量級鎖,是指當鎖是輕量級鎖時,當自旋的線程自旋了必定的次數後,尚未獲取到鎖,就會進入阻塞狀態,該鎖升級爲重量級鎖,重量級鎖會使其餘線程阻塞,性能下降。
(8)自旋鎖
自旋鎖,是指嘗試獲取鎖的線程不會阻塞,而是循環的方式不斷嘗試,這樣的好處是減小線程的上下文切換帶來的開鎖,提升性能,缺點是循環會消耗CPU。
(9)監視器鎖
synchronized的實現方式,使用monitorenter和monitorexit來實現。
(10)mutex鎖
互斥鎖,LockSupport.part()底層是經過mutex實現的。
招募令:
由於彤哥自己工做也比較繁忙,很難作到日更,因此這裏誠邀廣大好友積極投稿,你們一塊兒學習一塊兒進步。
可在公衆號後臺給我留言「投稿」,互加好友詳細討論投稿內容。
固然,其它問題也可在公衆號後臺留言,不論是生活上、工做上、心理上仍是身體上的,歡迎叨擾,留言必回。
歡迎關注個人公衆號「彤哥讀源碼」,查看更多源碼系列文章, 與彤哥一塊兒暢遊源碼的海洋。