我有一个像这样的静态变量的类

private static Object sMyStaticVar;

如果我想在构造函数中为此var赋值,我有如下代码
if(sMyStaticVar == null) sMyStaticVar = new CustomObject(someRuntimeObject);

其中someRuntimeObject是在加载类时不可用的对象,因此阻止了我像下面这样声明我的静态变量
private static Object sMyStaticVar = new CustomObject(someRuntimeObject);

我的问题是,构造函数线程中的静态var对象的初始化是否安全?我的直觉告诉我它不是,我应该使用非运行时类类型作为锁进行同步,如下所示
synchronized(MyClass.class)
{
    if(sMyStaticVar == null) sMyStaticVar = new CustomObject(someRuntimeObject);
}

(与从getClass()获得的runTime类型相反)

但由于我的直觉通常是错误的,如果有人能为我提供一些启示,我将不胜感激!

最佳答案

如果它是静态的,则不应在构造函数中分配它。创建一个执行该public static synchronized void initialize(someRuntimeObject)的静态初始化方法。

注意synchronized关键字:它与MyClass.class上的同步相同

07-26 00:58