想象一下下面的课程。
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();
}
}
,但我认为应该有时是这样。也许代码只是错误地尝试了..