LockSupport都不知道,怎么拿offer跟压?

LockSupport是一個(gè)編程工具類胰蝠,主要是為了阻塞和喚醒線程用的。使用它我們可以實(shí)現(xiàn)很多功能,今天主要就是對(duì)這個(gè)工具類的講解茸塞,希望對(duì)你有幫助:

一躲庄、LockSupport簡(jiǎn)介

1、LockSupport是什么

剛剛開頭提到過(guò)钾虐,LockSupport是一個(gè)線程工具類噪窘,所有的方法都是靜態(tài)方法,可以讓線程在任意位置阻塞效扫,也可以在任意位置喚醒倔监。

它的內(nèi)部其實(shí)兩類主要的方法:park(停車阻塞線程)和unpark(啟動(dòng)喚醒線程)。

image

注意上面的123方法菌仁,都有一個(gè)blocker浩习,這個(gè)blocker是用來(lái)記錄線程被阻塞時(shí)被誰(shuí)阻塞的。用于線程監(jiān)控和分析工具來(lái)定位原因的济丘。

現(xiàn)在我們知道了LockSupport是用來(lái)阻塞和喚醒線程的瘦锹,而且之前相信我們都知道wait/notify也是用來(lái)阻塞和喚醒線程的,那么它相比闪盔,LockSupport有什么優(yōu)點(diǎn)呢弯院?

2、與wait/notify對(duì)比

這里假設(shè)你已經(jīng)了解了wait/notify的機(jī)制泪掀,如果不了解听绳,可以在網(wǎng)上一搜,很簡(jiǎn)單异赫。相信你既然學(xué)到了這個(gè)LockSupport椅挣,相信你已經(jīng)提前已經(jīng)學(xué)了wait/notify。

我們先來(lái)舉一個(gè)使用案例:

image

上面這段代碼的意思是塔拳,我們定義一個(gè)線程鼠证,但是在內(nèi)部進(jìn)行了park,因此需要unpark才能喚醒繼續(xù)執(zhí)行靠抑,不過(guò)上面量九,我們?cè)贛yThread進(jìn)行的park,在main線程進(jìn)行的unpark颂碧。

這樣來(lái)看荠列,好像和wait/notify沒有什么區(qū)別。那他的區(qū)別到底是什么呢载城?這個(gè)就需要仔細(xì)的觀察了肌似。這里主要有兩點(diǎn):

(1)wait和notify都是Object中的方法,在調(diào)用這兩個(gè)方法前必須先獲得鎖對(duì)象,但是park不需要獲取某個(gè)對(duì)象的鎖就可以鎖住線程诉瓦。

(2)notify只能隨機(jī)選擇一個(gè)線程喚醒川队,無(wú)法喚醒指定的線程力细,unpark卻可以喚醒一個(gè)指定的線程。

區(qū)別就是這倆固额,還是主要從park和unpark的角度來(lái)解釋的眠蚂。既然這個(gè)LockSupport這么強(qiáng),我們就深入一下他的源碼看看对雪。

二河狐、源碼分析(基于jdk1.8)

1米绕、park方法

image

blocker是用來(lái)記錄線程被阻塞時(shí)被誰(shuí)阻塞的瑟捣。用于線程監(jiān)控和分析工具來(lái)定位原因的。setBlocker(t, blocker)方法的作用是記錄t線程是被broker阻塞的栅干。因此我們只關(guān)注最核心的方法迈套,也就是UNSAFE.park(false, 0L)。

UNSAFE是一個(gè)非常強(qiáng)大的類碱鳞,他的的操作是基于底層的桑李,也就是可以直接操作內(nèi)存,因此我們從JVM的角度來(lái)分析一下:

每個(gè)java線程都有一個(gè)Parker實(shí)例:

image

我們換一種角度來(lái)理解一下park和unpark窿给,可以想一下贵白,unpark其實(shí)就相當(dāng)于一個(gè)許可,告訴特定線程你可以停車崩泡,特定線程想要park停車的時(shí)候一看到有許可禁荒,就可以立馬停車?yán)^續(xù)運(yùn)行了。因此其執(zhí)行順序可以顛倒角撞。

現(xiàn)在有了這個(gè)概念呛伴,我們體會(huì)一下上面JVM層面park的方法,這里面counter字段谒所,就是用來(lái)記錄所謂的“許可”的热康。

本文部分總結(jié)來(lái)源于:http://www.reibang.com/p/1f16b838ccd8

當(dāng)調(diào)用park時(shí),先嘗試直接能否直接拿到“許可”劣领,即_counter>0時(shí)姐军,如果成功,則把_counter設(shè)置為0,并返回尖淘。

image

如果不成功庶弃,則構(gòu)造一個(gè)ThreadBlockInVM,然后檢查_counter是不是>0德澈,如果是歇攻,則把_counter設(shè)置為0,unlock mutex并返回:

image

否則梆造,再判斷等待的時(shí)間缴守,然后再調(diào)用pthread_cond_wait函數(shù)等待葬毫,如果等待返回,則把_counter設(shè)置為0屡穗,unlock mutex并返回:

image

這就是整個(gè)park的過(guò)程贴捡,總結(jié)來(lái)說(shuō)就是消耗“許可”的過(guò)程。

2村砂、unpark

還是先來(lái)看一下JDK源碼:

image

上面注釋的意思是給線程生產(chǎn)許可證烂斋。

當(dāng)unpark時(shí),則簡(jiǎn)單多了础废,直接設(shè)置_counter為1汛骂,再unlock mutext返回。如果_counter之前的值是0评腺,則還要調(diào)用pthread_cond_signal喚醒在park中等待的線程:

image

ok帘瞭,現(xiàn)在我們已經(jīng)對(duì)源碼進(jìn)行了分析,整個(gè)過(guò)程其實(shí)就是生產(chǎn)許可和消費(fèi)許可的過(guò)程蒿讥。而且這個(gè)生產(chǎn)過(guò)程可以反過(guò)來(lái)蝶念。也就是先生產(chǎn)再消費(fèi)。下面我們使用幾個(gè)例子驗(yàn)證一波芋绸。

三媒殉、LockSupport使用

1、先interrupt再park

image

我們看一下結(jié)果:

image

2摔敛、先unpark再park

image

我們只需在park之前先休眠1秒鐘廷蓉,這樣可以確保unpark先執(zhí)行。

image

OK舷夺,今天的文章先寫到這苦酱,如有問(wèn)題,還請(qǐng)批評(píng)指正给猾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疫萤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敢伸,更是在濱河造成了極大的恐慌扯饶,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件池颈,死亡現(xiàn)場(chǎng)離奇詭異尾序,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)躯砰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門每币,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琢歇,你說(shuō)我怎么就攤上這事兰怠∶渭” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵揭保,是天一觀的道長(zhǎng)肥橙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秸侣,這世上最難降的妖魔是什么存筏? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮味榛,結(jié)果婚禮上椭坚,老公的妹妹穿的比我還像新娘。我一直安慰自己励负,他們只是感情好藕溅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布匕得。 她就那樣靜靜地躺著继榆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汁掠。 梳的紋絲不亂的頭發(fā)上略吨,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音考阱,去河邊找鬼翠忠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乞榨,可吹牛的內(nèi)容都是我干的秽之。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼吃既,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼考榨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鹦倚,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤河质,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后震叙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掀鹅,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年媒楼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乐尊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡划址,死狀恐怖扔嵌,靈堂內(nèi)的尸體忽然破棺而出昏滴,到底是詐尸還是另有隱情,我是刑警寧澤对人,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布谣殊,位于F島的核電站,受9級(jí)特大地震影響牺弄,放射性物質(zhì)發(fā)生泄漏姻几。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一势告、第九天 我趴在偏房一處隱蔽的房頂上張望蛇捌。 院中可真熱鬧,春花似錦咱台、人聲如沸络拌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)春贸。三九已至,卻和暖如春遗遵,著一層夾襖步出監(jiān)牢的瞬間萍恕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工车要, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允粤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓翼岁,卻偏偏與公主長(zhǎng)得像类垫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅坡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容