天天看點

并發程式設計之知識梳理 第二部分全文内容引用

Java 并發包

  • 全文内容
    • 線程池
      • 好處
      • 實作原理
        • 線程池的主要處理流程
        • ThreadPoolExecutor執行示意圖
      • 使用
        • 建立
        • 向線程池送出任務
        • 關閉
        • 合理地配置線程池
        • 線程池的監控
      • Executor
        • 架構簡介
          • 兩級排程模型
          • 結構
            • 類與接口
            • 使用示意圖
          • 成員
        • ThreadPoolExecutor
        • ScheduleThreadPoolExecutor
        • FutureTask
    • 容器和架構
      • ConcurrentHashMap
      • ConcurrentLinkedQueue
      • Java中的阻塞隊列
      • Fork/Join架構
        • 是什麼?
        • 工作竊取算法
        • 異常處理
    • 并發工具類
      • CountDownLatch
        • 重要方法:
        • 為什麼不使用ReentrantLock?
      • Semaphore
      • CyclicBarrier
        • 重要方法:
      • Phaser
      • Exchanger
    • 原子操作類
  • 引用

你好! 這是我對于Java 并發程式設計相關知識點的梳理與思考,希望對你能有所幫助;菜鳥萌新,問題多多,歡迎指出,謝謝!(全文連結: 點選線上檢視清晰思維導圖.)

本文章以圖為主,如果文章中沒有圖檔,麻煩移步: 連結.

全文内容

并發程式設計之知識梳理 第二部分全文内容引用

線程池

好處

并發程式設計之知識梳理 第二部分全文内容引用

實作原理

線程池的主要處理流程

并發程式設計之知識梳理 第二部分全文内容引用

ThreadPoolExecutor執行示意圖

并發程式設計之知識梳理 第二部分全文内容引用

使用

建立

并發程式設計之知識梳理 第二部分全文内容引用

向線程池送出任務

并發程式設計之知識梳理 第二部分全文内容引用

關閉

并發程式設計之知識梳理 第二部分全文内容引用

合理地配置線程池

并發程式設計之知識梳理 第二部分全文内容引用

線程池的監控

并發程式設計之知識梳理 第二部分全文内容引用

Executor

架構簡介

兩級排程模型
并發程式設計之知識梳理 第二部分全文内容引用
結構
并發程式設計之知識梳理 第二部分全文内容引用

類與接口

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

使用示意圖

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
成員
并發程式設計之知識梳理 第二部分全文内容引用

ThreadPoolExecutor

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

ThreadPoolExecutor執行任務示意圖:

并發程式設計之知識梳理 第二部分全文内容引用

CachedThreadPool的execute()的運作示意

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

CachedThreadPool的任務傳遞示意圖:

并發程式設計之知識梳理 第二部分全文内容引用

ScheduleThreadPoolExecutor

ScheduledThreadPoolExecutor的任務傳遞示意圖:

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

ScheduledThreadPoolExecutor的任務執行步驟:

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

FutureTask

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

FutureTask的設計示意圖:

并發程式設計之知識梳理 第二部分全文内容引用

FutureTask的級聯喚醒示意圖:

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

容器和架構

ConcurrentHashMap

并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用
并發程式設計之知識梳理 第二部分全文内容引用

ConcurrentLinkedQueue

Java中的阻塞隊列

并發程式設計之知識梳理 第二部分全文内容引用

Fork/Join架構

是什麼?

并發程式設計之知識梳理 第二部分全文内容引用

工作竊取算法

并發程式設計之知識梳理 第二部分全文内容引用

異常處理

并發程式設計之知識梳理 第二部分全文内容引用

并發工具類

并發程式設計之知識梳理 第二部分全文内容引用

CountDownLatch

在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。

  • 基于AbstractQueuedSynchronizer實作,state初始化為count,每countDown一次減1直到等于0,
  • unpark喚醒await線程

重要方法:

  • await():調用此方法線程會被阻塞,直到count為0
  • await(long timeout, TimeUnit unit):同await(),可以設定最大等待時間,如超過最大等待時間,則不再等待
  • countDown():count減1,直至為0

為什麼不使用ReentrantLock?

countDown不需要堵塞,隻需要在最後一次count=0時去喚醒堵塞的主線程(await),AQS+LockSupport完全夠用。

Semaphore

  • 計數信号量,用于控制特定資源在同一個時間被通路的個數
  • 基于AbstractQueuedSynchronizer實作,支援公平和非公平信号量,預設非公平信号量,state初始化為permits。

CyclicBarrier

  • 一個可循環使用(Cyclic)的屏障(Barrier),讓一組線程到達一個屏障(同步點)時被阻塞,直到最後一個線程到達屏障時,屏障才會放行,所有被屏障攔截的線程繼續執行。
  • 基于ReentrantLock+Condition實作,await後先lock,然後–count,不等于0就執行Condition.await。反之,重置count并執行Condition.signalAll喚醒所有堵塞線程。

重要方法:

  • await():在CyclicBarrier上進行阻塞等待,并使count減1
  • await(long timeout, TimeUnit unit):在CyclicBarrier上進行限時的阻塞等待,并使count減1,當時間到達限定時間後,線程繼續執行
  • getParties():擷取CyclicBarrier通過屏障的線程數量,也稱為方數
  • getNumberWaiting():擷取正在CyclicBarrier上等待的線程數量

Phaser

Exchanger

原子操作類

并發程式設計之知識梳理 第二部分全文内容引用

引用

[1]: 連結: https://mp.weixin.qq.com/s/-PRq4ChaCkEFB_DJyyKhvg

[2]: 《Java并發程式設計的藝術》 方騰飛 魏鵬 程曉明

[3]: 《Java并發程式設計之美》翟陸續,薛賓田