執行緒等待通知機制總結
概述
乙個執行緒的等待阻塞狀態,受另外乙個執行緒控制。
object.wait()
object.notify()
特點必須基於特定的物件鎖synchronized
notify只會對已經處於wait狀態的執行緒生效。
使用必須在synchronized(obj)**內部使用,否則會丟擲異常
原理執行緒等待/喚醒在特定的物件鎖obj上
執行緒中斷
wait()中的執行緒,被其他執行緒t.interrupt()後,可中斷阻塞狀態,繼續執行**,並丟擲interruptedexception異常。
locksupport.park()
locksupport.unpark(t)
特點不需要維護同一物件,可實現模組之間的解耦
unpark可對已經處於park(),或者下次處於park()狀態的執行緒生效
原理內部呼叫的是unsafe.park/unpark()方法實現的
執行緒中斷
park()中的執行緒,被其他執行緒t.interrupt()後,可中斷阻塞狀態,繼續執行**,不丟擲interruptedexception異常。
object.wait()/notify()
使用案例
執行結果
特點
多個執行緒用於維護同乙個物件鎖。
wait notify等需要在synchronized物件鎖內部呼叫,否則會丟擲illegalmonitorstateexception。
使用場景
生產消費者模型
locksupport.park()/unpark()
使用案例
執行結果
特點
兩個執行緒之間不需要維護同乙個物件,可以實現模組之間的解耦。
unpark可以在park之前呼叫,可以對之後的執行緒t的一次park進行喚醒。
使用場景
基於cas原理,用於實現鎖的內部機制。
lock.lock()/unlock() condition.await()/asignal()
使用案例
執行結果
1 2 a 3 4 b 5 6 c
特點
使用場景
允許執行緒在一定時間內獲取鎖,獲取失敗則返回(而非陷入休眠);
允許讀寫鎖分離的場景;
允許以任何順序獲取和釋放多個鎖。
多執行緒學習大綱:
等待 通知機制
waitnotify模式的注意事項 經典案例生產者消費者模式實現 實戰等待通知之交叉備份 舉例說明,廚師和服務員之間的互動 1.廚師做完一道菜的時間不確定,所以廚師將菜品放到 菜品傳遞臺 上的時間也不確定 2.服務員取到菜的時間取決於廚師,所以服務員就處於等待狀態 3.服務員如何取到菜呢?又得取決於...
Conditon等待 通知機制
condition的api和object的wait notify用法大致相同,但是object需要配合synchronized來使用,如果使用顯示鎖lock無法使用。因此condition應運而生,他是由lock的api建立出來的等待 通知機制 await signal 和wait notify 相...
03 Java多執行緒 執行緒等待通知機制
三 執行緒等待通知 四 參考 如果等待時長為t,當前時間為now,那麼now t以後超時 long overtime now t long remain t while result不滿足 remian 0 return result shop類模擬商店,初始狀態玩具是nothing,執行緒等待玩具...