核心的接口:Lock和ReetranLock數組
JUC下幾個經常使用的鎖處理類:安全
ReentranLock:互斥鎖異步
ReadWriteLock:讀寫鎖工具
Condition:控制隊列spa
LockSupport:阻塞原語線程
Semaphore:信號量接口
CountDownLatch:閉鎖隊列
CyclicBarrier:柵欄同步
Exchange:交換機it
CompletableFuture:線程回調
因爲synchronized能夠保證數據安全,可是全部的線程只能共享一把鎖,因此JUC中作了各種工具的引用
ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。
Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裏扮演鎖的角色,HashEntry則用於存儲鍵值對數據。
一個ConcurrentHashMap裏包含一個Segment數組,Segment的結構和HashMap相似,是一種數組和鏈表結構, 一個Segment裏包含一個HashEntry數組,每一個HashEntry是一個鏈表結構的元素, 每一個Segment守護者一個HashEntry數組裏的元素,當對HashEntry數組的數據進行修改時,必須首先得到它對應的Segment鎖。
這是一個ArrayList的線程安全的變體,其原理大概能夠通俗的理解爲:初始化的時候只有一個容器,很常一段時間,這個容器數據、數量等沒有發生變化的時候,你們(多個線程),都是讀取(假設這段時間裏只發生讀取的操做)同一個容器中的數據,因此這樣你們讀到的數據都是惟1、一致、安全的.
可是後來有人往裏面增長了一個數據,這個時候CopyOnWriteArrayList 底層實現添加的原理:
CopyOnWriteArrayList最大的問題是不能保證數據的實時一致性,由於如果有線程在進行寫操做的時候,其餘讀操做的線程還是讀老的list,不能保證立馬看到數據的改變