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
。
添加回答
举报