(https://github.com/Wasabi1234/Java-Concurrency-Progamming-Tutorial)java
public native void park(boolean var1, long var2); public native void unpark(Object var1);
舉個例子:
git
直接使用Unsafe仍是有諸多不便之處,所以lock包提供了一個輔助類LockSupport封裝了park和unpark程序員
舉個例子:
github
能夠看出,使用LockSupport要比直接只用Unsafe更加便捷。多線程
此外,LockSupport還能夠用來給線程設置一個Blocker對象,便於調試和檢測線程,其原理是使用Unsafe的putObject方法直接設置Thread對象的parkBlocker屬性,並在合適的時候讀取這個Blocker對象,例子以下:ui
各類鎖ReentrantLock、ReentrantReadWriteLock以及各類同步器諸Semaphore、CountDownLatch等,核心都是AbstractQueuedSynchronizerthis
要真正從源頭理解AQS,建議仔細閱讀該類的設計者的論文
(http://gee.cs.oswego.edu/dl/papers/aqs.pdf)線程
讓咱們先具體感知它是如何使用的。設計
這裏有一個很是簡單的例子SimpleLock,實現了一個最簡單的排它鎖。3d
運行結果代表,經過簡單的幾行代碼,就實行了一個鎖的全部功能。
根據JUC做者的建議,AQS的使用方法要遵循上面這個模式。
通常是
或者
這樣可讓暴露出的同步、互斥方法名由程序員自行決定。
例如各類鎖可使用
Semaphore可使用
CountDownLatch可使用
要實現一個同步器,須要三個條件:
讓咱們看看AQS又是如何設計知足的這三個條件。
private volatile int state; protected final int getState() { return state; } protected final void setState(int newState) { state = newState; } protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }
state 爲 volatile int型,它的CAS方法,提供原子的比較更新操做。
通常,AQS認爲
LockSupport 提供了阻塞和解除阻塞的功能。所以,全部同步器的阻塞操做其實都是基於LockSupport的,也就是基於Unsafe的park和unpark方法的。
AQS內部提供了一個Node類型,它是用來造成「線程等待隊列」的節點類型,以及一個由Node類型組成的隊列。