Java volatile和构造对象

时间:2018-09-30 18:28:12

标签: java multithreading java-memory-model

我需要一些内存模型建议。

我们知道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并写给str1str2处于事前关系。这是因为根据inter-thread semantic执行对str1 / str2的写入,因此它们处于程序顺序。因此,我们写给mc hb 的内容是mc,因此将始终打印“ str1str2”。

此外,如果我们将字段str1 / str2设为 非易失性 ,则将不再有这种保证。

我的判断正确吗?你能扩大吗?

0 个答案:

没有答案