java api 線程通信

多線程通訊的api:

wait 和notify、notifyAll

原理:
wait的實現(xiàn)原理是利用對象的等待隊列,執(zhí)行的時候會給鎖的對象的等待隊列加一條,執(zhí)行的時候會釋放當(dāng)前鎖,讓其他線程正常調(diào)用鎖對象。

注意:

  1. 都應(yīng)該在synchronize代碼塊中執(zhí)行,否則會報錯,跟內(nèi)部機(jī)制有關(guān)系。
  2. wait的執(zhí)行時機(jī)很重要,一定要確保在其他線程notify之前wait,否則就會出現(xiàn)邏輯問題,一直wait的情況。
  3. 官方建議判斷是否進(jìn)入等待狀態(tài)應(yīng)該在循環(huán)中檢查(while),而不應(yīng)該用if判斷,原因是底層“偽喚醒”的問題會導(dǎo)致程序執(zhí)行沒有notify或者unpark就被喚醒。
park 和unpark

原理:
利用的是令牌機(jī)制,park負(fù)責(zé)等待,一次消耗一個令牌,unpark負(fù)責(zé)發(fā)令牌,一次發(fā)一個,park、unpark沒有次序問題,但是要注意一個unpark只能發(fā)一個令牌,如果調(diào)用了多次park還是會一直等待。

注意:

  1. unpark需要指定thread對象
    LockSupport.park();
    LockSupport.unpark(someThread);
  2. park的內(nèi)部機(jī)制不是通過鎖的監(jiān)視,而是直接掛起線程,因此不能放到synchronize代碼塊中,因為park不會釋放鎖,這樣會導(dǎo)致代碼塊永遠(yuǎn)不會被執(zhí)行。
  3. 官方建議判斷是否進(jìn)入等待狀態(tài)應(yīng)該在循環(huán)中檢查(while),而不應(yīng)該用if判斷,原因是底層“偽喚醒”的問題會導(dǎo)致程序執(zhí)行沒有notify或者unpark就被喚醒。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線程通信 想要實現(xiàn)多個線程之間的協(xié)同,如:線程執(zhí)行順序,獲取某個線程執(zhí)行結(jié)果等,則需要使用線程之間互相通信。 文件...
    依弗布德甘閱讀 167評論 0 0
  • 當(dāng)多個線程可以一起工作去解決某個問題時,如果某些部分必須在其它部分之前完成,那么就需要對線程進(jìn)行協(xié)調(diào)。 join(...
    脆皮雞大蝦閱讀 373評論 1 0
  • 線程通信 線程通信指的是多個線程在運(yùn)行的期間,相互之間的數(shù)據(jù)交互協(xié)作。 1.通信方式 實現(xiàn)多個線程直接的協(xié)作,涉及...
    JuneWool閱讀 337評論 0 0
  • 線程通信的方法 程序在使用多線程執(zhí)行任務(wù)時,經(jīng)常需要線程之間協(xié)同工作。此時,我們需要了解線程通信的手段。 線程通信...
    疊最厚的甲閱讀 779評論 0 0
  • 相關(guān)源碼:boy-learning-thread 個人博客:http://bruce.bugmakers.cl...
    BruceOuyang閱讀 208評論 0 0

友情鏈接更多精彩內(nèi)容