wait(),notify(),notifyAll()必須加鎖的原因


從語義方面解析為什么需要鎖:

  1、wait()方法會釋放鎖,如果沒有先獲得鎖,那么如何釋放? 

從實際的作用:

  為了預防飢餓線程的產生。

 原因:

// 線程A 的代碼
while(!condition){ // 不能使用 if , 因為存在一些特殊情況, 使得線程沒有收到 notify 時也能退出等待狀態
    wait();
}
// do something

  

// 線程 B 的代碼
if(!condition){ 
	// do something ...
    condition = true;
    notify();
}

現在考慮, 如果wait() 和 notify() 的操作沒有相應的同步機制, 則會發生如下情況

【線程A】 進入了 while 循環后(通過了 !condition 判斷條件, 但尚未執行 wait 方法), CPU 時間片耗盡, CPU 開始執行線程B的代碼
【線程B】 執行完畢了 condition = true; notify(); 的操作, 此時【線程A】的 wait() 操作尚未被執行, notify() 操作沒有產生任何效果
【線程A】執行wait() 操作, 進入等待狀態,如果沒有額外的 notify() 操作, 該線程將持續在 condition = true 的情形下, 持續處於等待狀態得不到執行。


原文鏈接:https://blog.csdn.net/lengxiao1993/article/details/52296220


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM