鎖支持LockSupport
從上面我可以看到,當需要阻塞或者喚醒一個線程的時候,AQS都是使用LockSupport這個工具類來完成的 。
LockSupport是用來創(chuàng)建鎖和其他同步類的基本線程阻塞原語
每個使用LockSupport的線程都會與一個許可關聯(lián),如果該許可可用,并且可在進程中使用,則調用park()將會立即返回,否則可能阻塞 。如果許可尚不可用,則可以調用 unpark 使其可用 。但是注意許可不可重入,也就是說只能調用一次park()方法,否則會一直阻塞 。
LockSupport定義了一系列以park開頭的方法來阻塞當前線程,unpark(Thread thread)方法來喚醒一個被阻塞的線程 。如下:
park(Object blocker)方法的blocker參數(shù),主要是用來標識當前線程在等待的對象,該對象主要用于問題排查和系統(tǒng)監(jiān)控 。
park方法和unpark(Thread thread)都是成對出現(xiàn)的,同時unpark必須要在park執(zhí)行之后執(zhí)行,當然并不是說沒有不調用unpark線程就會一直阻塞,park有一個方法,它帶了時間戳(parkNanos(long nanos):為了線程調度禁用當前線程,最多等待指定的等待時間,除非許可可用) 。
底層支持
park()方法的源碼如下:
public static void park() {
UNSAFE.park(false, 0L);
}
unpark(Thread thread)方法源碼如下:
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
從上面可以看出,其內部的實現(xiàn)都是通過UNSAFE(sun.misc.Unsafe UNSAFE)來實現(xiàn)的,其定義如下:
public native void park(boolean var1, long var2);
public native void unpark(Object var1);
兩個都是native本地方法 。Unsafe 是一個比較危險的類,主要是用于執(zhí)行低級別、不安全的方法集合 。盡管這個類和所有的方法都是公開的(public),但是這個類的使用仍然受限,你無法在自己的java程序中直接使用該類,因為只有授信的代碼才能獲得該類的實例 。
參考資料
【線程阻塞的原因 線程阻塞】Doug Lea:《Java并發(fā)編程實戰(zhàn)》方騰飛:《Java并發(fā)編程的藝術》
(今完)
推薦閱讀
- 含猴的吉祥語
- 黃金彩虹蘭花的養(yǎng)殖方法和注意事項,黃金彩虹蘭花缺點?
- 紅雪花養(yǎng)殖注意事項和修剪方法,紅雪花的養(yǎng)殖方法?
- 地震是怎么形成的兒童講解 地震是怎么形成的
- 樹菠蘿怎么看熟沒熟 樹上的樹菠蘿怎么看熟不熟
- 耐寒的多肉植物有哪些品種,多肉植物耐寒嗎?
- 清苑縣是哪個省的
- 人們吃的海帶為什么要打結
- 蘿卜施肥禁忌,蘿卜如何施肥?
- 柚子的品種,柚子的種類?
