构造函数和/或初始化线程安全吗?

时间:2020-04-18 02:11:48

标签: java multithreading java-memory-model

想象一下下面的课程。

class Whatever {
    Object obj;
    Whatever() {
        obj = new Object();
    }
    Object get() {
        return obj;
    }
}

由于线程通常写入其本地缓存,因此我假设以下内容:

如果线程A创建了一个Whatever的实例,并且线程B在该实例上调用了get(),那么 可能会发生{ {1}}之所以获得B,是因为null的引用仅写在obj的语言环境缓存中,而不是在共享缓存中。

我是对的吗?那其他类型的初始化呢?


我尝试使用以下代码来产生这种行为。

A

输出永远不会是class Main { static Whatever whatever = new Whatever(); static class Whatever { Object obj; Whatever() { obj = new Object(); } } public static void main(String[] args) { Thread t1 = new Thread(() -> { while (!Thread.interrupted()) { whatever = new Whatever(); } }); Thread t2 = new Thread(() -> { while (!Thread.interrupted()) { System.out.println(whatever.obj); } }); t1.start(); t2.start(); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } t1.interrupt(); t2.interrupt(); } } ,但我认为应该有时是这样。也许代码只是错误地尝试了..

0 个答案:

没有答案