【发布时间】:2014-11-25 11:47:23
【问题描述】:
我正在尝试编写一个实例方法来延迟初始化几个静态变量。我正在初始化的对象是不可变的,并且对象的引用不会被类中的任何其他实例或静态方法更改。我希望初始化代码永远不会被执行超过一次,即使在许多不同的线程中可能有该类的多个实例。初始化需要在实例方法中进行,因为该方法会覆盖超类中的方法。我使用的方法如下。
private static volatile boolean isPrepared;
private static volatile Object object1;
private static volatile Object object2;
private static volatile Object object3;
@Override
void prepare() {
synchronized (this.getClass()) {
if (isPrepared) { return; }
object1 = expensiveCalculation1();
object2 = expensiveCalculation2();
object3 = expensiveCalculation3();
isPrepared = true;
}
}
我假设由于初始化发生在单个同步块中,因此实例不可能将isPrepared 视为true,除非object1、object2 和object3 都是非空。我还假设它不会通过简单地将prepare() 声明为synchronized 来工作,因为锁只是this。我的假设正确吗?另外,当您希望将多个变量标记为volatile 时将它们视为一起初始化,或者我应该将它们捆绑到一个不可变类中,这是一个好主意吗?
【问题讨论】:
标签: java synchronized volatile static-variables