從語義方面解析為什么需要鎖:
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