J.U.C併發包梳理與補充

在不同的地方學習了許多和併發相關的工具或者類並總結在了不同的博文中,這裏做一個總的關係梳理並進行相關的補充,首先來看下 J.U.C 包下的分類:
在這裏插入圖片描述
主要分爲如下幾個部分:

  1. 線程執行器 executor 及其線程池實現類
  2. 鎖 locks
  3. 原子變量類 atomic
  4. 併發工具類 tools
  5. 併發集合 collections

核心

  • CAS:是java.util.concurrent.atomic包的基礎
  • AQS:是java.util.concurrent.locks包以及一些常用類比如Semophore,ReentrantLock等類的基礎

原子操作類 atomic

Atomic包裏一共提供了12個類,屬於4種類型的原子更新方式,分別是原子更新基本類型,原子更新數組,原子更新引用和原子更新屬性,Atomic包裏的類基本都是使用Unsafe實現的包裝類。
在這裏插入圖片描述每種類型所具有的方法都差不多,這裏列舉一下各個類型的常用方法:
更新基本類型(AtomicInteger)

  • int addAndGet(int data)
    以原子的方式將輸入的數值與實例中的值相加,返回結果
  • boolean compareAndSet(int expect,int update)
    如果輸入的數值等於預期值,則以原子方式將該值設置爲輸入的值
  • int getAndIncrement()
    以原子方式加1
  • int getAndSet(int newValue)
    以原子方式設置爲newValue的值,並返回舊值

更新數組類(AtomicIntegerArray)

  • int addAndGet(int i,int data)
    以原子方式將輸入值與數組索引 i 的元素相加
  • boolean compareAndSet(int i,int expect,int update)
    如果當前值等於預期值,則以原子方式將數組i位置的元素設置成update值

併發集合 collections

CopyOnWrite

在這裏插入圖片描述

BlockingQueue

BlockingQueue主要用於生產者-消費者模式,在多線程場景時生產者線程在隊列尾部添加元素,而消費者線程則在隊列頭部消費元素,這樣可達到任務的生產和消費進行隔離的目的

根據底層實現的不同,我們可以劃分出多個Blocking Queue的子類:

  • ArrayBlockingQueue: 一個由數組結構組成的有界阻塞隊列
    有邊界的必須在初始化時定義容量大小,以先進先出的方式去存儲數據
  • LinkedBlockingQueue: 一個由鏈表結構組成的有界/無界阻塞隊列
    它大小是可以指定的,也可以不指定,不指定就採用默認,也是先進先出
  • PriorityBlockingQueue: 一個支持優先級排序的無界阻塞隊列
    優先級爲主的,而不是先進先出,元素按照優先級順序被移除
  • DealyQueue:一個使用優先級隊列實現的無界阻塞隊列
    是一個具有延遲取出的隊列,當延遲期滿,才能獲取元素
  • SynchronousQueue:一個不存儲元素的阻塞隊列
    插入一個元素後就被堵塞,直到這個元素被其他進程消費掉
  • LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列
    是2,5的合體,性能比第2個更高,能存儲更多的元素
  • LinkedBlockingDeque: 一個由鏈表結構組成的雙向阻塞隊列
    是一個雙端隊列,之前在Fork/Join那裏講過,是用的work-stealing算法實現的,每個消費者都有自己的雙端隊列,完成了就竊取其他消費者的隊列末尾的任務

併發工具類 tools

閉鎖 CountDownLatch、柵欄 CyclicBarrier、信號量 Semaphore 可以參考:J.U.C

交換器Exchanger
交換器主要用於線程之間進行數據交換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數據。一個線程先到達同步點就會被阻塞,到另外一個線程也進入同步點爲止,兩個到達後就開始交換數據


線程執行器 Executor

參考:線程池原理


鎖 locks

參考:ReentrantLock

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