Concurrent包--複習總結

concurrent包

concurrent包是jdk1.5提供的一個針對高併發進行編程的包

BlockingQueue

阻塞式隊列:遵循先進先出的原則,阻塞式隊列本身使用過的時候是需要指定界限的。
ArrayBlockingQueue-阻塞式順序隊列–底層是基於數組來存儲的時運的時候需要指定一個容量,容量在指定之後不可改變。應用爲:生成-消費者模型
linkedBlockingQueue-阻塞式鏈式隊列–底層是基於鏈表即節點來進行數據的存儲,在使用的時候可以指定初始容量也可以不指定。如果指定了容量就以指定的容量進行存儲,如果不指定容量就以默認容量來存儲–默認容量是:Integer.MAX_VALUE=2^31 -1,如果不指定一般認爲容量是無限的
PriorityBlockingQueue-具有優先級的阻塞式隊列–默認容量是11.如果將元素取出,會對取出的元素進行自然排序–要求存儲的對象所對應的類必須實現Comparable接口,重寫器compareTo方法,將比較規則寫到方法中;如果進行迭代遍歷則不保證排序
SynchronousQueue-同步隊列–只允許存儲一個元素

ConcurrentMap-併發映射

HashMap-底層依靠數組+鏈表存儲的數據。默認初始容量爲16,默認加載因子是0.75f,默認擴容每次增加一倍,本身是一個異步式線程不安全的映射
Hashtable-同步式線程安全的映射–對外提供的方法都是同步方法
ConcurrentHashMap-異步線程安全的映射–在jdk1.8之前採用分段鎖(分桶鎖),分段鎖採用的是讀寫鎖機制;jdk1.8之後不再採用鎖機制,而是採用CAS(Compare and Swap)無鎖算法,減少了鎖的開銷;內部結構中,如果其中一個同中的元素個數超過了8個,那麼會將這個桶的鏈表扭轉成一棵紅黑樹(自平衡二叉查找樹)結構

ConcurrentNavigableMap

併發導航映射:其本身是一個接口更多的會使用其實現類–ConcurrentSkipListMap–併發跳躍表映射
跳躍表:爲了提高查詢效率所產生的一種數據結構–跳躍表是典型的以空間換時間的產物
在這裏插入圖片描述
如果跳躍表中插入新的數據,新數據是否往上提取遵循“拋硬幣”原則即1/2原則-只要保證這個節點有一般的機率能被提取就可以了。
跳躍表的數據結構適合於大量的查詢而不增刪的場景

CountDownLatch

閉鎖:線程遞減鎖–對線程進行技術,當線程歸零的時候會放開阻塞讓線程繼續往下執行
在這裏插入圖片描述

在這裏插入圖片描述
CyclicBarrier-柵欄
當所有線程都到達了同一個點之後才繼續往下執行
在這裏插入圖片描述
在這裏插入圖片描述
Exchange-交換機
用於交換連個線程之間的信息
在這裏插入圖片描述
Semaphore-信號量
用於計數-信號在被用完之後,後來的線程阻塞,直到有信號被歸還,被阻塞的線程才能取得信號繼續執行
在這裏插入圖片描述

線程池

線程池:如果每一個請求對應一個線程,那麼會導致大量的創建線程和銷燬線程。減少線程的創建和銷燬,希望能夠重複使用已有的線程,就有了線程池即存儲線程的隊列
線程池的特點:
1.線程池在川建安的時候裏面沒有線程
2.當過來請求的時候就會在線程池中創建一個線程來處理這個請求,當請求處理完成之後線程就會還回線程池等待下一個請求
3.核心線程在線程池中需要限定數量
4.如果所有的核心線程都在使用,那麼再來的線程就會放入工作隊列中,工作隊列是一個阻塞式隊列。
5.如果所有的核心線程都被佔用並且工作隊列已滿,那麼會創建臨時線程區處理新的請求
6.臨時新城處理完請求之後並不是立即銷燬,而是存活一段時間,如果過了這段時間依然沒有新的請求,那麼臨時線程就被銷燬
在這裏插入圖片描述
在這裏插入圖片描述

java提供的線程池

在這裏插入圖片描述

Callable和Runnable的區別

1.Runnable線程執行完成之後沒有返回值;Callable需要定義返回值類型並且返回結果
2.Runable線程可以通過Thread啓動執行,也可以通過線程池啓動執行;Callable只能通過線程池來執行
3.Runnable沒有容錯機制,一旦出現異常需要自己處理;Callable可以將異常拋出利用全局的方式來處理

scheduledExecutorService-定時執行者服務

在這裏插入圖片描述
在這裏插入圖片描述

分叉合併-For and Join

將一個大任務不斷的分成多個小任務(分叉),小任務在執行完成之後再將結果進行彙總(合併)
任務在分叉之後會分發到CPU不同的核上去,然後利用核進行數據的處理。原來的for循環只是在一個核上來執行的代碼,所欲就導致分叉合併效率要高於for循環
分叉合併採取了work-stealing(工作竊取)策略來實現線程的高效操作–當一個核上的所有線程執行完成,就會隨機挑一個核,從這個核的線程隊列中偷取最後一個線程回來,然後執行
在這裏插入圖片描述
分叉合併會帶來資源共享問題
在這裏插入圖片描述
在這裏插入圖片描述

Lock

鎖機制比synchronized更加靈活,存在公平和非公平策略:
非公平策略是當線程釋放鎖之後依然可以再次搶佔資源;
公平策略是當線程釋放鎖之後會到隊列中讓其他線程進行進行搶佔資源
從效率上考慮,非公平的效率會更高
在這裏插入圖片描述

ReadWriteLock–讀寫鎖

readlock:讀鎖–允許多個線程讀但是不允許線程寫
writelock:寫鎖–允許一個線程寫,但是不允許線程讀

Volatile–原子性操作

在這裏插入圖片描述
volatile本身是一個關鍵字,保證屬性在多線程場景下的原子性
線程在底層的執行過程可能產生的指令的錯亂—寄存器/PC計數器
volatile–限定線程在執行過程中必須按照給定的指令順序來執行
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章