同步语句建立了先发生关系。但我不确定细节。在http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html可以阅读
监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法入口)之前
我想知道我是否理解正确。因此,请看以下示例。让我们假设有 2 个线程 T1、T2 共享类 Data 的相同实例数据和类 Object 的对象。现在以下代码按给定的线程和顺序执行:
(1)T1: data.setValue("newValue");
(2)T1: synchronized(object){}
(3)T2: synchronized(object){}
(4)T2: String str=data.getValue();
因为 (1) 和 (2) 在同一个线程中执行,所以有 hb(1,2) 和模拟 hb(3,4)。在 (2) 中是监视器的解锁,在 (3) 中是同一监视器的锁定,因此 hb(2,3),因此 hb(1,4) 和 str 应该等于“newValue”。那是对的吗?如果不是 hb(2,3) 应该是错误的,但为什么呢?
编辑
因为需要数据类的详细信息来回答这个问题:
public class Data {
private String value
public void setValue(String newValue){
value=newValue;
}
public String getValue getValue(){
return value;
}
}
编辑2 很清楚,不能保证执行顺序。当一个人有
(1*)T1: synchronized(object){data.setValue("newValue");}
(2*)T2: synchronized(object){String str=data.getValue();}
也不能保证 (1*) 在 (2*) 之前执行,但如果我是对的,则可以保证在 (2*) 之后,如果 (1*) 在 (2*) 之前执行,则 str= "newValue" *)。我想知道第一个例子是否同样适用