我是豬弟,豬在我心中不是蠢的代名詞
而是懶的代名詞
微信公眾號:glmapper工作室
在之前的學習過程中,發現要學的東西越學越多,Java&計算機知識體系之大,要想學完談何容易,但是總結下來,在網際網路中有三大滾輪:分散式、高併發、中介軟體,一口氣瘦不成一道閃電,必須逐一攻破。
想寫高併發很久了,但是這裡面有很多東西,真滴難! 今天總算是要開篇了,回想起來真的就像做夢一樣。
1、併發包整體結構
先來看一下併發包的整體結構:
整體結構分為三層,先看一下頂層:- Lock:鎖,實現和synchronized關鍵字相同的功能和語義
- Synchronizer:同步器,保證執行緒同步,就是按照預定的先後順序進行,執行緒同步的機制主要有:臨界區、互斥量、事件、訊號量四種方式,雖然java中有許多同步器,並且功能上各不相同,但它們的內部設計上卻差別不大
- BlockingQueue:阻塞佇列,是一個支援兩個附加操作的佇列。這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。阻塞佇列常用於生產者和消費者的場景,阻塞佇列就是生產者存放元素的容器,也是消費者獲取元素的容器
- Executor:執行器,與執行緒池相關
- 併發容器:執行緒安全的併發訪問容器(如:
java.util.concurrent.ConcurrentHashMap
等)
然後看一下中間層:
- AQS(
AbstractQueueSynchronizer
):抽象佇列同步器,AQS是JUC同步器的基石,AQS定義了一套多執行緒訪問共享資源的同步器框架,許多同步類實現都依賴於它,如常用的ReentrantLock、Condition 、Semaphore 、ReentrantReadWriteLock 、CyclicBarrier 、CountDownlatch
等 - 非阻塞資料結構:基礎資料結構
- 原子變數類:
java.util.concurrent.atomic
包下的原子變數類
然後看最底層:
- volatile:保證共享變數的可見性,對單個讀/寫具有原子性,JVM底層採用“記憶體屏障”來實現
volatile
語義,禁用指令重排序,進而保證有序性 - CAS:
CompareAndSwap
,一種基於硬體的樂觀鎖實現,原理是“比較交換”,保證變數操作的原子性,但是存在ABA
的問題。
2、系列文章內容規劃
為了防止看客們因為難以理解的底層原理覺得枯燥難懂【AQS真的挺不好理解的】,文章準備自頂而下來講述併發包的內容,然後在其中穿插一些底層的內容,最後不知不覺中底層就已經講完了。
- 介紹常見同步器元件(併發工具類)的用法和實踐:
ReentrantLock、Condition 、Semaphore 、ReentrantReadWriteLock 、CyclicBarrier 、CountDownlatch 、Phaser 、Exchanger
- 介紹CAS、CLH鎖和AQS原理
- 併發工具類原始碼分析:
ReentrantLock、Condition 、Semaphore 、ReentrantReadWriteLock 、CyclicBarrier 、CountDownlatch 、Phaser 、Exchanger
- 併發容器原始碼分析:
ConcurrentHashMap 、ConcurrentLinkedQueue 、ConcurrentSkipListMap
- 阻塞佇列原始碼分析:
ArrayBlockingQueue 、PriorityBlockingQueue 、DelayQueue 、SynchronousQueue 、LinkedTransferQueue 、LinkedBlockingDeque
- 執行器使用和原始碼分析:
ThreadPoolExecutor 、ScheduledThreadPoolExecutor