深刻理解JUC(java.util.concurrent)

Concurrent下的核心類

  1. Executor:具備runnable任務的執行者
  2. ExecutorService:一個線程池管理者,實現類有多種,能把runnable,callable提交到線程池中
  3. Semaphore:一個計數信號量
  4. ReentranLock:一個可重入的互斥鎖定Lock,功能相似於synchronized鎖,功能更強大寫
  5. Future: 表示異步計算的結果
  6. BlockQueue:阻塞隊列
  7. CompletionService:ExecutorService的擴展類,能夠得到線程的執行結果
  8. CountDownLatch:一個同步輔助類,在完成一組正在其餘線程執行的操做前,它容許一個或多個線程等待
  9. CyclicBarrier:一個同步輔助類,它容許一組線程互相等待,直到達到某個公共屏障值。

 

 

Concurrent如何防止死鎖

核心的接口:Lock和ReetranLock數組

 

JUC下幾個經常使用的鎖處理類:安全

ReentranLock:互斥鎖異步

ReadWriteLock:讀寫鎖工具

Condition:控制隊列spa

LockSupport:阻塞原語線程

Semaphore:信號量接口

CountDownLatch:閉鎖隊列

CyclicBarrier:柵欄同步

Exchange:交換機it

CompletableFuture:線程回調

 

 

因爲synchronized能夠保證數據安全,可是全部的線程只能共享一把鎖,因此JUC中作了各種工具的引用

 

從新認識ConcurrentHashMap和CopyOnWriteArrayList

ConcurrentHashMap

 

ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。

Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裏扮演鎖的角色,HashEntry則用於存儲鍵值對數據。

一個ConcurrentHashMap裏包含一個Segment數組,Segment的結構和HashMap相似,是一種數組和鏈表結構, 一個Segment裏包含一個HashEntry數組,每一個HashEntry是一個鏈表結構的元素, 每一個Segment守護者一個HashEntry數組裏的元素,當對HashEntry數組的數據進行修改時,必須首先得到它對應的Segment鎖。

 

 

CopyOnWriteArrayList

這是一個ArrayList的線程安全的變體,其原理大概能夠通俗的理解爲:初始化的時候只有一個容器,很常一段時間,這個容器數據、數量等沒有發生變化的時候,你們(多個線程),都是讀取(假設這段時間裏只發生讀取的操做)同一個容器中的數據,因此這樣你們讀到的數據都是惟1、一致、安全的.

可是後來有人往裏面增長了一個數據,這個時候CopyOnWriteArrayList 底層實現添加的原理:

  1. 先經過lock.lock獲取到鎖,保證一次只有一個線程添加元素
  2. 而後copy出一個容器(能夠簡稱副本),這個副本的長度爲原數組的length+1
  3. 再往新的容器裏添加這個新的數據,最後把新的容器的引用地址賦值給了以前那個舊的的容器地址

 

CopyOnWriteArrayList最大的問題是不能保證數據的實時一致性,由於如果有線程在進行寫操做的時候,其餘讀操做的線程還是讀老的list,不能保證立馬看到數據的改變

相關文章
相關標籤/搜索