『夢話高併發』J.U.C@併發包整體結構

J_Queue發表於2018-01-26

我是豬弟,豬在我心中不是蠢的代名詞
而是懶的代名詞


微信公眾號:glmapper工作室

『夢話高併發』J.U.C@併發包整體結構

在之前的學習過程中,發現要學的東西越學越多,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

相關文章