【发布时间】:2014-12-19 11:54:10
【问题描述】:
我最近遇到了一个有趣的问题:
例如我有A类:
class A {
int a;
int b;
public A() {
a = 1;
b = 2;
}
public int getA() {return a;}
public int getB() {return b;}
}
A 类只能作为单例存在; 因此,为了提供对单例的访问,我创建了类 Factory:
class Factory {
private A a;
public A getA() {
if (a == null) {
synchronized(this) {
if (a == null) {
a = new A();
}
}
}
return a;
}
}
据我了解,根据 JVM 中的重新排序,如果 2 个线程同时访问 Factory.getA(),则其中一个线程可能会获得部分构造的对象,这可能导致应用程序崩溃。
但如果我将 A a 设为私有; volatile 我可以确定每个线程只会访问完全构造的对象吗?
因此,作为结论,如果我将变量 x 标记为 volatile,它会影响 x.class 构造函数的内容吗?
【问题讨论】:
标签: java multithreading volatile