1. 程式人生 > >面試 LockSupport.park()會釋放鎖資源嗎?

面試 LockSupport.park()會釋放鎖資源嗎?

(手機橫屏看原始碼更方便)


引子

大家知道,我最近在招人,今天遇到個同學,他的原始碼看過一些,然後我就開始了AQS連環問。

我:說說AQS的大致流程?

他:AQS包含一個狀態變數,一個同步佇列……balabala……互斥鎖balabala,共享鎖balabala……

我:AQS中除了同步佇列,還有什麼佇列?

他:還有個Condition,Condition中有個條件佇列……

我:條件佇列和同步佇列有什麼區別?

他:條件佇列balabala,然後呼叫LockSupport.park()進入休眠,等待被喚醒,……,balabala

咦,這時我靈感突發:LockSupport.park()和Thread.sleep()有什麼區別?

他:Thread.sleep()不會釋放鎖資源,……,balabala

我:LockSupport.park()會釋放鎖資源嗎?

他:會吧。(估計和Object.wait()搞混淆了)

我:會嗎?會嗎?會嗎?

他(羞澀地低下了頭):彤哥,不知道,你的文章裡沒寫。(這段我瞎寫的哈^^)

OK,今天我們就來看看LockSupport.park()到底會不會釋放鎖資源。

Thread.sleep()和Object.wait()的區別

首先,我們先來看看Thread.sleep()和Object.wait()的區別,這是一個爛大街的題目了,大家應該都能說上來兩點。

(1)Thread.sleep()不會釋放佔有的鎖,Object.wait()會釋放佔有的鎖;

(2)Thread.sleep()必須傳入時間,Object.wait()可傳可不傳,不傳表示一直阻塞下去;

(3)Thread.sleep()到時間了會自動喚醒,然後繼續執行;

(4)Object.wait()不帶時間的,需要另一個執行緒使用Object.notify()喚醒;

(5)Object.wait()帶時間的,假如沒有被notify,到時間了會自動喚醒,這時又分好兩種情況,一是立即獲取到了鎖,執行緒自然會繼續執行;二是沒有立即獲取鎖,執行緒進入同步佇列等待獲取鎖;

其實,他們倆最大的區別就是Thread.sleep()不會釋放鎖資源,Object.wait()會釋放鎖資源。

Thread.sleep()和Condition.await()的區別

我們再來看看Thread.sleep()和Condition.await()的區別。

其實,這個題目和上面的題目比較類似,因為本來Object.wait()和Condition.await()的原理就比較類似,可以參考之前彤哥寫的《死磕 java執行緒系列之執行緒的生命週期》之篇文章。

這個題目的回答思路跟Object.wait()是基本一致的,不同的是Condition.await()底層是呼叫LockSupport.park()來實現阻塞當前執行緒的。

實際上,它在阻塞當前執行緒之前還幹了兩件事,一是把當前執行緒新增到條件佇列中,二是“完全”釋放鎖,也就是讓state狀態變數變為0,然後才是呼叫LockSupport.park()阻塞當前執行緒,可以參考之前彤哥寫的《死磕 java同步系列之ReentrantLock原始碼解析(二)——條件鎖》這篇文章。

看到這裡,今天開篇提的那個問題是不是就有答案了呢【本文由公從號“彤哥讀原始碼”原創】?

Thread.sleep()和LockSupport.park()的區別

LockSupport.park()還有幾個兄弟方法——parkNanos()、parkUtil()等,我們這裡說的park()方法統稱這一類方法。

(1)從功能上來說,Thread.sleep()和LockSupport.park()方法類似,都是阻塞當前執行緒的執行,且都不會釋放當前執行緒佔有的鎖資源;

(2)Thread.sleep()沒法從外部喚醒,只能自己醒過來;

(3)LockSupport.park()方法可以被另一個執行緒呼叫LockSupport.unpark()方法喚醒;

(4)Thread.sleep()方法宣告上丟擲了InterruptedException中斷異常,所以呼叫者需要捕獲這個異常或者再丟擲;

(5)LockSupport.park()方法不需要捕獲中斷異常;

(6)Thread.sleep()本身就是一個native方法;

(7)LockSupport.park()底層是呼叫的Unsafe的native方法;

Object.wait()和LockSupport.park()的區別

二者都會阻塞當前執行緒的執行,他們有什麼區別呢?經過上面的分析相信你一定很清楚了,真的嗎?往下看!

(1)Object.wait()方法需要在synchronized塊中執行;

(2)LockSupport.park()可以在任意地方執行;

(3)Object.wait()方法宣告丟擲了中斷異常,呼叫者需要捕獲或者再丟擲;

(4)LockSupport.park()不需要捕獲中斷異常【本文由公從號“彤哥讀原始碼”原創】;

(5)Object.wait()不帶超時的,需要另一個執行緒執行notify()來喚醒,但不一定繼續執行後續內容;

(6)LockSupport.park()不帶超時的,需要另一個執行緒執行unpark()來喚醒,一定會繼續執行後續內容;

(7)如果在wait()之前執行了notify()會怎樣?丟擲IllegalMonitorStateException異常;

(8)如果在park()之前執行了unpark()會怎樣?執行緒不會被阻塞,直接跳過park(),繼續執行後續內容;

最後兩點是不是沒想到?!

其實,在《死磕 java執行緒系列之自己動手寫一個執行緒池(續)》這篇文章裡程式碼註釋裡稍微提到過unpark()這個方法,它先執行,則後續的park()方法將不再起作用。

park()/unpark()底層的原理是“二元訊號量”,你可以把它相像成只有一個許可證的Semaphore,只不過這個訊號量在重複執行unpark()的時候也不會再增加許可證,最多隻有一個許可證。

關於訊號量的內容,可以參考《死磕 java同步系列之Semaphore原始碼解析》這篇文章。

LockSupport.park()會釋放鎖資源嗎?

不會,它只負責阻塞當前執行緒,釋放鎖資源實際上是在Condition的await()方法中實現的。

彩蛋

好了,上面我們交叉對比了Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的區別。

讓我們用一張思維導圖結束今天的內容。


歡迎關注我的公眾號“彤哥讀原始碼”,檢視更多原始碼系列文章, 與彤哥一起暢遊原始碼的海洋。

相關推薦

面試 LockSupport.park()釋放資源

(手機橫屏看原始碼更方便) 引子 大家知道,我最近在招人,今天遇到個同學,他的原始碼看過一些,然後我就開始了AQS連環問。 我:說說AQS的大致流程? 他:AQS包含一個狀態變數,一個同步佇列……balabala……互斥鎖balabala,共享鎖balabala…… 我:AQS中除了同步佇列,還有什麼佇

為什麼await()後執行lock.unlock,await()時不就釋放

withdraw 10 need Wait for a deposit now balance 0 Thread 1Thread 2Balance Deposit 44signalAll  newDeposit.await() after:---------------------withdraw 10 n

標記如果過多,就出現線程等待其他線程釋放標記

all 退出 自己的 void output div 釋放 其他 oid 鎖標記如果過多,就會出現線程等待其他線程釋放鎖標記,而又都不釋放自己的鎖標記供其他線程運行的狀況。就是死鎖。 死鎖的問題通過線程間的通信的方式進行解決。 線程間通信機制實際上也就是協調機制。 線程間通

為什麼程式設計師都很排斥面試時做題?答不出題的程式設計師是大牛

相信很多人都有過這樣的經歷,就是去面試的時候,先被要求做題。 如果像下面的判斷選擇還好! 如果是讓寫個什麼演算法之類的,那就呵呵了!每天和滑鼠握手,還哪會寫字啊! 關於這件事,很多小夥伴紛紛吐槽。 網友一: 不止是程式設計師,沒有誰喜歡面試時做題吧。 對於程式設計師

【面試題】多執行緒在執行過程中,某個執行緒執行時,突然釋放發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

Mysql delete之後釋放空間

MySQL刪除資料幾種情況以及是否釋放磁碟空間1、drop table table_name 立刻釋放磁碟空間 ,不管是 InnoDB和MyISAM2、truncate table table_name 立刻釋放磁碟空間 ,不管是 Innodb和MyISAM 。      t

Java執行緒之釋放釋放資源釋放CPU

多執行緒中的wait與sleep到底誰釋放了鎖 首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼叫b的sl

teradata delete釋放空間

系統在下列情況下會使用spool空間: • 在session沒有結束時,每個使用者查詢的返回值。因此,為了儲存查詢的返回值,每個使用者都必須有足夠的spool空間。 • 大表. • Large volatile tables. These tables require mo

阿里巴巴前端第一輪面試問題,你被刷掉

文章這幾個問題來自阿里巴巴面試同行的記錄,下面幾個問題是他第一輪面試遇到的。 像阿里巴巴前端面試,一般就是三面,第一面主要是問一些基礎的東西,第二面則是專案實習類的深入探討,第三面相對會更綜合一些。 一、阿里巴巴一面流程: 自我介紹就不說了,主要看自己口才語言組織能力,

WeakMap 本身釋放,而 keyObject 沒有釋放的情況下,value 釋放

部落格園markdown不太好看,可以轉到git閱讀https://sologgfun.github.io/look/ const keyObject = ['keyObject']; new WeakMap().set(keyObject, ['value']); 問題:現

面試官心服口服:Thread.sleep、synchronized、LockSupport.park的執行緒阻塞有何區別?

### **前言** 在日常編碼的過程中,我們經常會使用Thread.sleep、LockSupport.park()主動阻塞執行緒,或者使用synchronized和Object.wait來阻塞執行緒保證併發安全。此時我們會發現,對於Thread.sleep和Object.wait方法是會丟擲Interr

數據庫表查詢及釋放

bject bsp cnblogs div lock v$lock col ssi where 鎖表查詢 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_object

給一次重新選擇的機會_您還選擇程序員

jpeg -i 電腦 程序員 $$ 多少 tps 編寫程序 又一 原文鏈接 選擇了程序員就要經常面對電腦編寫程序,工作繁忙而且壓力很大,與人交談機會也不多,一般都會很孤單,沒有多少歡聲笑語。在漫漫的程序長路上走了很久,當時對編程的喜愛已經埋沒在了沒完沒了工作中,完成工作放在

ArcEngine真正釋放文件,徹底移除圖層

div itl control borde 工作 空間 efi tor syn ArcMap在加載圖層時會自動生成一個lock格式的加鎖文件,右擊移除圖層後,加鎖文件也會自動刪除。但AE開發中卻不能正常刪除,移除圖層後加鎖文件依然存在,這就導致在其他地方無法對該圖層進行操作

Java的LockSupport.park()實現分析(轉載)

兩個 這也 his access 需要 tracking orm return 指令 LockSupport類是Java6(JSR166-JUC)引入的一個類,提供了基本的線程同步原語。LockSupport實際上是調用了Unsafe類裏的函數,歸結到Unsafe裏,只有

經濟轉型中,你淪為底部階層

勞動者 png 連續 來看 進程 如果 將在 政府 範圍 作者:孫驍驥。更多資訊請關註微信公眾號“驥觀天下”(jiguantx) 最近,金融時報旗下的《中國投資參考》(China Confidential)發布調查,指出中國高凈值家庭最近投資占收入的比例逐漸減

恐懼:中年程序員害怕丟掉工作?(很多評論)

創業 當我 改變 生成 技術 有時 變化 如果 有意 剛入行的時候,聽說程序員是吃青春飯的,只能幹到 30 歲。過了幾年,這個說法變成了 35 歲。如今,我都已經過了 35 歲了,這個說法現在是 40 歲。 有時和曾經一同畢業的同學會聊起這個話題,唏噓感慨,人到中年,想到

golang _下劃線占位符代替需要釋放資源的問題

color lap ngs pla open pan mage 操作 read golang中_有兩種作用,一種用在import中,比如這樣 import _ "github.com/go-sql-driver/mysql" 表示並不需要導入整個包,只是執行這個包裏面所有的

小程序取代Native App

公眾號 基於 spa 排行 blog .cn ati 可視化 微信   商城小程序上線之初,就被各行各業的人所追捧,足以可見小程序的重要性,那麽小程序會取代Native App嗎?  2016年12月28日,張小龍曾於微信公開課上表示,“真正實現了公眾號的入口不在微信裏面,

美媒稱美國司法部正調查華為,華為重蹈中興覆轍

華為在美國貿易戰日漸升級的當下。近日據華爾街日報又再次爆出,美國司法部正在調查華為公司是否違反向伊朗禁運的有關制裁。不過,目前華為對此拒絕發表評論。 說實話,華為和中興此次遭遇的不公正待遇還真挺冤枉的。中興是一直積極主動地在美國市場發力,且憑借自己的努力收獲了不少市場份額。同時也為美國創造了不少工作崗位、繳