併發系列(六)-----concurrent的簡單介紹
一 簡介
concurrent包是jdk1.5引入的重要的包,主要程式碼由大牛Doug Lea完成。這個包下的一些類如果用好了可以很方便的保證資料在多執行緒下操作的正確性。就比如說執行緒共享的i++,如果使用concurrent包下的Atomic系列類可以很方便的解決這個問題。這篇文章簡單的介紹Concurrent包,讓你對Concurrent的整體有一個大體的瞭解,以及簡單的瞭解它的實現原理。
二 concurrent的組成
concurrent包組成由atomic包和lock包以及一些類組成,開啟開發工具鎖定到concurrent看一看。
1. BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等
2.java.util.concurrent.atomic:提供所有原子操作的類, 如AtomicInteger, AtomicLong等;
3. java.util.concurrent.locks:提供鎖相關的類, 如Lock, ReentrantLock, ReadWriteLock, Condition等;
下面是網上收集的一張圖
三 公平鎖與非公平鎖
公平鎖:加鎖前檢查是否有排隊等待的執行緒,優先排隊等待的執行緒,先來先得
非公平鎖:加鎖時不考慮排隊等到的問題,直接嘗試獲取鎖,獲取不到自動到對尾等待
四 簡單的原理說明
由於Java的CAS同時具有volatile讀和volatile寫的記憶體語義,因此Java執行緒之間的通訊現在有了下面4種方式。
1.A執行緒寫volatile變數,隨後B執行緒讀這個volatile變數。
2.A執行緒寫volatile變數,隨後B執行緒用CAS更新這個volatile變數。
3.A執行緒用CAS更新一個volatile變數,隨後B執行緒用CAS更新這個volatile變數。
4.A執行緒用CAS更新一個volatile變數,隨後B執行緒讀這個volatile變數。
一定要理解上面這四種執行緒之間的通訊,因為在concurrent包中大量的用到了其中的語句含義,如果不明白其中的語義請看以前的文章。
concurrent包的原始碼實現,會發現一個通用化的實現模式
首先,宣告共享變數為volatile。
然後,使用CAS的原子條件更新來實現執行緒之間的同步。
同時,配合以volatile的讀/寫和CAS所具有的volatile讀和寫的記憶體語義來實現執行緒之間的通訊。
AQS,非阻塞資料結構和原子變數類(java.util.concurrent.atomic包中的類),這些concurrent包中的基礎類都是使用這種模式來實現的,而concurrent包中的高層類又是依賴於這些基礎類來實現的。從整體來看,concurrent包的實現示意圖如所示。
參考文件:併發程式設計藝術