J.U.C并發(fā)包簡介
J.U.C并發(fā)包, 即java.util.concurrent包, 是JDK的核心工具包, 是JDK1.5之后, 由 Doug Lea實現(xiàn) 并引入.
整個J.U.C包按照功能可劃分如下:
- J.U.C_locks: 鎖框架
- J.U.C_atomic: 原子類框架
- J.U.C_sync: 同步器框架
- J.U.C_collections: 集合框架
- J.U.C_executors: 執(zhí)行器框架
J.U.C_locks 鎖框架
早期的JDK版本中, 僅僅提供了synchronizd桩皿、wait幢炸、notify等等比較底層的多線程同步工具, 開發(fā)人員如果需要開發(fā)復雜的多線程應用, 通常需要基于JDK提供的這些基礎工具進行封裝, 開發(fā)自己的工具類. JDK1.5+后, Doug Lea根據(jù)一系列常見的多線程設計模式, 設計了JUC并發(fā)包, 其中java.util.concurrent.locks包下提供了一系列基礎的鎖工具, 用以對synchronizd、wait宛徊、notify等進行補充佛嬉、增強.
-
接口
- Lock
- Condition
- ReadWriteLock
-
實現(xiàn)類
- ReentrantLock
- ReentrantReadWriteLock
- StampedLock
-
輔助類
- LockSupport
- AbstractOwnableSynchronizer
- AbstractQueuedLongSynchronizer
- AbstractQueuedSynchronizer
本部分相關(guān)文章:
J.U.C_atomic 原子類框架
早期的JDK版本中, 如果要并發(fā)的對Integer暖呕、Long赡盘、Double之類的Java原始類型或引用類型進行操作, 一般都需要通過鎖來控制并發(fā), 以防數(shù)據(jù)不一致.
從JDK1.5開始, 引入了java.util.concurrent.atomic工具包, 該包提供了許多Java原始/引用類型的映射類, 如AtomicInteger缰揪、AtomicLong葱淳、AtomicBoolean, 這些類可以通過一種“無鎖算法”, 線程安全的操作Integer、Long艳狐、Boolean等原始類型.
所謂“無鎖算法”, 其實底層就是通過Unsafe類實現(xiàn)的一種比較并交換的算法, 大致的結(jié)構(gòu)如下: boolean compareAndSet(expectedValue, updateValue); 當希望修改的值與expectedValue相同時, 則嘗試將值更新為updateValue, 更新成功返回true, 否則返回false.
-
更新基本類型
- AtomicBoolean
- AtomicInteger
- AtomicLong
-
更新數(shù)組類型
- AtomicIntegerArray
- AtomicLongArray
- AtomicReferenceArray
-
更新引用類型
- AtomicReference
- AtomicMarkableReference
- AtomicStampedReference
-
更新字段
- AtomicIntegerFieldUpdater
- AtomicLongFieldUpdater
- AtomicReferenceFieldUpdater
-
其他
- Striped64
- DoubleAccumulator
- DoubleAdder
- LongAccumulator
- LongAdder
- Striped64
本部分相關(guān)文章:
J.U.C_sync 同步器框架
這里的J.U.C_sync同步器框架, 是指java.util.concurrent包下一些輔助同步器類, 每個類都有自己適合的使用場景:
- CountDownLatch: 倒數(shù)計數(shù)器, 構(gòu)造時設定計數(shù)值, 當計數(shù)值歸零后, 所有阻塞線程恢復執(zhí)行. 內(nèi)部實現(xiàn)了AQS框架.
- CyclicBarrier: 循環(huán)柵欄, 構(gòu)造時設定等待線程數(shù), 當所有線程都到達柵欄后, 柵欄放行. 其內(nèi)部通過ReentrantLock和Condition實現(xiàn)同步.
- Semaphore: 信號量, 類似于令牌, 用于控制共享資源的訪問數(shù)量. 其內(nèi)部實現(xiàn)了AQS框架.
- Exchanger: 交換器, 類似于雙向柵欄, 用于線程之間的配對和數(shù)據(jù)交換. 其內(nèi)部根據(jù)并發(fā)情況有“單槽交換”和“多槽交換”之分.
- Phaser: 多階段柵欄, 相當于CyclicBarrier的升級版, 可用于分階段任務的并發(fā)控制執(zhí)行. 其內(nèi)部比較復雜, 支持樹形結(jié)構(gòu), 以減少并發(fā)帶來的競爭.
本部分相關(guān)文章:
J.U.C_collections 集合框架
這里的J.U.C_collections集合框架, 是指java.util.concurrent包下的一些同步集合類, 按類型劃分可以分為: 符號表毫目、隊列、Set集合镀虐、列表 四大類, 每個類都有自己適合的使用場景.
-
符號表
- ConcurrentMap: 接口
- ConcurrentNavigableMap
- ConcurrentSkipListMap
- ConcurrentHashMap
- ConcurrentNavigableMap
- ConcurrentMap: 接口
-
隊列
- BlockingQueue
- TransferQueue
- LinkedTransferQueue
- BlockingDeque
- LinkedBlockingDeque
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
- TransferQueue
- ConcurrentLinkedQueue
- ConcurrentLinkedDueue
- BlockingQueue
-
Set集合
- CopyOnWriteArraySet
- ConcurrentSkipListSet
-
列表
- CopyOnWriteArrayList
本部分相關(guān)文章:
J.U.C_executors 執(zhí)行器框架
executors框架是整個J.U.C包中類/接口關(guān)系最復雜的框架, executors其實可以劃分為3大塊, 每一塊的核心都是基于Executor這個接口.
- 線程池
- Future模式
- Fork/Join框架
本部分相關(guān)文章:
本文借鑒自segmentfault并發(fā)專欄