深入java併發包原始碼(一)簡介
阿新 • • 發佈:2018-11-16
閱讀本文章前需要了解 CAS 操作是什麼。
首先大致介紹一下需要講到的幾個類,只需要理解這幾個類是什麼關係即可,後面會有詳細解析。
Unsafe :這個類提供了 native 方法,未開源,提供了執行緒阻塞和喚醒,原子操作等方法。
LockSupport :包裝了一層 Unsafe 類,非常類似於代理者模式,將在 Unsafe 類中的執行緒掛起喚醒等操作匯出,避免將 UNSAFE
類引入程式碼造成複雜性上升,並且降低了耦合。
首先我們看一下以 ReentrantLock 為代表的併發工具與 JUC 底層類的關係。
AQS 類:用 Unsafe 類的 CAS 操作和 LockSupport
ReentrantLock:實現了 Lock 介面,持有自定義的 AQS 內部類,通過 AQS 內部類實現鎖的操作,然後將 AQS 對映到 Lock 介面上。
接下來仔細介紹一下這些類的實現
Unsafe
Unsafe 類有相當多的功能,比如記憶體管理,執行緒同步,對類和陣列進行一些騷操作 。想要獲取這個類需要用到利用 Java 反射。本篇文章只介紹一些關於併發的操作。
如果有興趣可以去看一下這篇部落格
方法名 | 功能 |
---|---|
park() | 阻塞執行緒,可以通過引數控制掛起時間和是否可以被中斷 |
unpark() | 喚醒執行緒 |
compareAndSwapObject | CAS 操作 Object |
compareAndSwapInt | CAS 操作 int |
LockSupport
LockSupport 只是對 Unsafe 類進行封裝了而已,下面的方法都是直接呼叫 UNSAFE 類中的方法。
方法名 | 功能 |
---|---|
park() | 阻塞執行緒 |
parkNanos(long nanos) | 阻塞執行緒,在 nanos 毫秒後喚醒 |
parkUntil(long deadline) | 阻塞執行緒,直到 deadline 時間 |
unpark(Thread thread) | 喚醒處於阻塞狀態的執行緒 |
使用 synchronized 在 dump 執行緒的時候會帶有當前執行緒正在等待物件的資訊,然而使用這些方法得不到這些資訊,開發人員疏漏了這點。所以在 LockSupport 在 Java 6 中添加了這幾個方法。
方法名 | 功能 |
---|---|
park() | 阻塞執行緒, |
parkNanos(Object blocker, long nanos) | 阻塞執行緒,在 nanos 毫秒後喚醒 |
parkUntil(Object blocker,long deadline) | 阻塞執行緒,直到 deadline 時間 |
unpark(Object blocker,Thread thread) | 喚醒處於阻塞狀態的執行緒 |
blocker 就是當前執行緒正在等待的物件,使用下面表格的方法就可以把在 dump 執行緒的時候把等待的物件匯出了。