我需要一些内存模型建议。
我们知道volatile write
和随后的volatile read
之间发生的是先于关系。我们也知道构造函数是不同步的,在构造函数返回和使用字段初始化(最终字段除外)之间没有hb。现在考虑以下代码:
public class MyClass{
public volatile String str1;
public volatile String str2;
public MyClass(String str1, String str2){
this.str1 = str1;
this.str2 = str2;
}
public void use(){
System.out.println(str1 + str2);
}
}
用法:
public volatile MyClass mc = null;
Thread(() -> {
mc = new MyClass("str1", "str2"));
}).start();
Thread(() -> {
If(mc != null)
mc.use; //Is it guaranteed that str1str2 will be printed if we get here?
}).start();
是否可以保证如果线程发现mc != null
,那么str1str2
将始终被打印?
我认为JMM保证 ,因为此处mc = new MyClass("str1", "str2"));
写给mc并写给str1
和str2
处于事前关系。这是因为根据inter-thread semantic执行对str1
/ str2
的写入,因此它们处于程序顺序。因此,我们写给mc
hb 的内容是mc
,因此将始终打印“ str1str2”。
此外,如果我们将字段str1
/ str2
设为 非易失性 ,则将不再有这种保证。
我的判断正确吗?你能扩大吗?