java多線程之四——LockSupport

本文基于java version "1.8.0_77"

LockSupport(java.util.concurrent.locks.LockSupport)是Java中底層類,提供了基本的線程同步原語。JUC中同步框架核心AQS(AbstractQueuedSynchronizer),就是通過使用LockSupport來實現線程的阻塞與喚醒的。我們先了解一下LockSupport類,為了解AQS做準備。
LockSupport中的兩個核心方法:

  • public static void park()
  • public static void unpark(Thread thread)

park譯為“停車”,官方文檔意為:許可。為了方便理解,在這里我們可以理解為阻塞,等待,掛起,而unpark我們理解為喚醒,恢復
這些字眼是不是很熟悉?我們在使用多線程的時候會調用object.wait()object.notify(),object.notifyall()來達到等待和喚醒的功能。此處我們可以比較著來學習。

與object的先wait,后notify方法不同的是,park與unpark無需擔心調用時序問題,可以先park,后unpark,也可以先park,后park。還有一點需要注意,多次連續給一個線程下發許可,但是這中間并沒有消耗的情況下,只會保留一個許可。(可以理解為許可的只有沒有之分,而沒有數量的多少)
當線程A調用park()后,會申請一個許可證:

  • 如果沒有許可,會阻塞當前線程,直至有其他線程下發許可(LockSupport.unpark(線程A))。
  • 如果此時已經能夠有一個許可,則可以繼續往下執行代碼。

我們來看下面的例子:

 public static void main(String[] args) {
        LockSupport.park();// 獲取許可
        System.out.println("END");
    }

運行上述代碼,會發現,該代碼不會打印END。因為當前線程申請一個許可而沒有線程給他許可,故一直阻塞,進程不會關閉。

多線程中通信的例子:


吃雞.png

結果:


image.png

上圖中可以看到,boyThread通過park阻塞線程,直至girlThread調用unpark喚醒。

看一個特殊例子:


image.png

結果:


image.png

可以看到,即便是已經下發了4個許可,但是實際上只有一個許可,也就是說許可存在的個數只有0或1。

其他方法:

  • void park(Object blocker)阻塞線程時添加附加信息,用來記錄線程是被誰堵塞的,程序出現問題時候,通過線程監控分析工具可以找出問題所。
  • void parkNanos(long nanos)參數為阻塞超時時間,超時時間過后,如果還沒有下發許可,則自動喚醒
  • void parkNanos(Object blocker, long nanos)同上,方法重載
  • void parkUntil(long deadline)參數為阻塞截止時間,為絕對時間,到達時間后,如果還沒有下發許可,則自動喚醒
  • void parkUntil(Object blocker, long deadline)同上,方法重載

與Object中wait和notify的區別

  • 比wait/notify更加輕便靈活。LockSupport直接操作線程,而wait/notify則是需要一個Object對線程進行操作。
  • 不依賴監視器(鎖)。wait/notify需要在synchronized中進行調用,它首先需要獲取到鎖,才能進行下面的操作。而LockSupport則是直接進行調用。(synchronized與wait/notify配合使用,ReentrantLock與Condition配合使用。而Condition就是使用LockSupport實現等待與喚醒的)

End

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,981評論 1 18
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 894評論 0 1
  • 該文章轉自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,376評論 3 87
  • 本文主要講了java中多線程的使用方法、線程同步、線程數據傳遞、線程狀態及相應的一些線程函數用法、概述等。 首先講...
    李欣陽閱讀 2,480評論 1 15
  • 認識你貌似已經有了幾年,但我們卻一直未曾見過,已經記不起時間過來多久,但是依稀記得開...
    91005a6a668c閱讀 174評論 0 0