Java線程阻塞的方法區(qū)別詳解
Thread.sleep()和Object.wait()的區(qū)別
(1)Thread.sleep()不會(huì)釋放占有的鎖,Object.wait()會(huì)釋放占有的鎖;
(2)Thread.sleep()必須傳入時(shí)間,Object.wait()可傳可不傳,不傳表示一直阻塞下去;
(3)Thread.sleep()到時(shí)間了會(huì)自動(dòng)喚醒,然后繼續(xù)執(zhí)行;
(4)Object.wait()不帶時(shí)間的,需要另一個(gè)線程使用Object.notify()喚醒;
(5)Object.wait()帶時(shí)間的,假如沒有被notify,到時(shí)間了會(huì)自動(dòng)喚醒,這時(shí)又分好兩種情況,一是立即獲取到了鎖,線程自然會(huì)繼續(xù)執(zhí)行;二是沒有立即獲取鎖,線程進(jìn)入同步隊(duì)列等待獲取鎖;
其實(shí),他們倆最大的區(qū)別就是Thread.sleep()不會(huì)釋放鎖資源,Object.wait()會(huì)釋放鎖資源。
Thread.sleep()和Condition.await()的區(qū)別 這個(gè)題目的回答思路跟Object.wait()是基本一致的,不同的是Condition.await()底層是調(diào)用LockSupport.park()來實(shí)現(xiàn)阻塞當(dāng)前線程的。
Thread.sleep()和LockSupport.park()的區(qū)別
(1)從功能上來說,Thread.sleep()和LockSupport.park()方法類似,都是阻塞當(dāng)前線程的執(zhí)行,且都不會(huì)釋放當(dāng)前線程占有的鎖資源;
(2)Thread.sleep()沒法從外部喚醒,只能自己醒過來;
(3)LockSupport.park()方法可以被另一個(gè)線程調(diào)用LockSupport.unpark()方法喚醒;
(4)Thread.sleep()方法聲明上拋出了InterruptedException中斷異常,所以調(diào)用者需要捕獲這個(gè)異?;蛘咴賿伋觯?/p>
(5)LockSupport.park()方法不需要捕獲中斷異常;
(6)Thread.sleep()本身就是一個(gè)native方法;
(7)LockSupport.park()底層是調(diào)用的Unsafe的native方法;
Object.wait()和LockSupport.park()的區(qū)別
(1)Object.wait()方法需要在synchronized塊中執(zhí)行;
(2)LockSupport.park()可以在任意地方執(zhí)行;
(3)Object.wait()方法聲明拋出了中斷異常,調(diào)用者需要捕獲或者再拋出;
(4)LockSupport.park()不需要捕獲中斷異?!颈疚挠晒珡奶?hào)“彤哥讀源碼”原創(chuàng)】;
(5)Object.wait()不帶超時(shí)的,需要另一個(gè)線程執(zhí)行notify()來喚醒,但不一定繼續(xù)執(zhí)行后續(xù)內(nèi)容;
(6)LockSupport.park()不帶超時(shí)的,需要另一個(gè)線程執(zhí)行unpark()來喚醒,一定會(huì)繼續(xù)執(zhí)行后續(xù)內(nèi)容;
(7)如果在wait()之前執(zhí)行了notify()會(huì)怎樣?拋出IllegalMonitorStateException異常;
(8)如果在park()之前執(zhí)行了unpark()會(huì)怎樣?線程不會(huì)被阻塞,直接跳過park(),繼續(xù)執(zhí)行后續(xù)內(nèi)容;
LockSupport.park()會(huì)釋放鎖資源嗎? 不會(huì),它只負(fù)責(zé)阻塞當(dāng)前線程,釋放鎖資源實(shí)際上是在Condition的await()方法中實(shí)現(xiàn)的。

到此這篇關(guān)于Java線程阻塞的方法區(qū)別詳解的文章就介紹到這了,更多相關(guān)Java線程阻塞的方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Security安裝配置及Thymeleaf整合
這篇文章主要介紹了SpringBoot Security安裝配置及Thymeleaf整合,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
java.lang.Long cannot be cast to ja
本文主要介紹了java.lang.Long cannot be cast to java.lang.Integer數(shù)據(jù)類型轉(zhuǎn)換異常解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java實(shí)現(xiàn)將String轉(zhuǎn)化為Int
這篇文章主要介紹了Java實(shí)現(xiàn)將String轉(zhuǎn)化為Int方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java多線程下解決資源競(jìng)爭(zhēng)的7種方法詳解
這篇文章主要介紹了Java多線程下解決資源競(jìng)爭(zhēng)的7種方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
springboot2.1.7去除json返回字段中為null的字段
這篇文章主要介紹了springboot2.1.7去除json返回字段中為null的字段,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
k8s中java如何設(shè)置jvm堆棧大小不超過request/limit
這篇文章主要介紹了k8s中java如何設(shè)置jvm堆棧大小不超過request/limit問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07

