實現方式:
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
正常調用
多線程通訊的一些小陷阱