線程通訊(線程協作)

實現方式:

1.suspend【掛起】  resume【恢復執行】(被棄用)

問題:

a.不釋放鎖

b.對執行順序要求嚴格

死鎖情況A.同步代碼中因爲suspend不釋放鎖,resume也就獲取不到鎖,不能通知到suspend掛起的線程

死鎖情況B.執行順序不對容易死鎖:多線程不確定性導致可能先執行了resume,而此時suspend由於在sleep沒收到這個通知,就再也收不到通知去執行了)

2.wait  notify/notifyAll:不會死鎖,因爲線程調用wait方法後會釋放鎖

問題:

對執行順序要求嚴格

基於監視器實現:

這些方法必須只能有同一個對象鎖的持有者線程調用也就是寫在代碼塊裏,否則會拋出異常

wait方法導致當前線程等待,加入該對象的等待集合中,並且釋放當前持有的對象鎖

notify/notifyAll 喚醒一個/所有正在等待這個對象鎖的線程

注意:雖然wait()自動解鎖,但是對順序有要求,如果在notify()之後才調用wait()方法,則線程永遠處於wait狀態

3.park()/unpark()

問題:

不釋放鎖

多次unpakr之後,再調用park,線程會直接運行,不會疊加

注意:不是監視器原理實現。所以在同步代碼synchronlized(){}中容易死鎖

====================================================================

以上三種方法,都沒有完美解決所有問題,所有推薦用後兩種酌情使用

 

suspend/resume正常調用

 

死鎖情況1:

死鎖情況2;

wait()/notify()

park /unpark

正常調用


多線程通訊的一些小陷阱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章