1 回答

TA貢獻1963條經驗 獲得超6個贊
您的設計存在一個根本缺陷:您正在同步對message
資源的訪問,而不是對receivedMessage
標志的訪問。當您在線程 #2 中設置標志時true
,JVM 沒有義務將該寫入傳播到線程 #3,因為該線程在進入塊內之前不會執行同步if
,而這很可能永遠不會發生。這同樣適用于線程#1 和#2 之間的通信。
and操作充當同步點,并且將使寫入在線程間可見,因此您需要在檢查標志之前調用它們acquire()
。例如在:release()
Fase3
@Override
public void run(){
try{
while(true){
resources[1].acquire(2); // All writes by thread #2 are now visible
if(receivedMessage){
resources[2].acquire(2);
System.out.println(message+1);
sleep(200);
receivedMessage = false;
resources[2].release(2);
}
resources[1].release(2);
}
} catch (InterruptedException e){
}
}
還有另一種解決方案,即制作receivedMessageflags volatile,但正確使用單個鎖定機制更清晰。
作為旁注,最好使用Runnable
s 而不是 extendingThread
。
添加回答
舉報