Java 多线程中声明期间的静态变量初始化

Java 多线程中声明期间的静态变量初始化,java,multithreading,static-variables,Java,Multithreading,Static Variables,我想将以下代码添加到我的类中: static private final ILogic_P logicInstanceI = (ILogic_P)Factory.CreateAnon("some.path.ILogic_P" + (SomeClass.isIMDB() ? "1" : "2")); public static ILogic_P getLogicInstanceI(){ return logicInstanceI; } 我不知道静态变量的初始化是否是线程安全的。

我想将以下代码添加到我的类中:

static private final ILogic_P logicInstanceI =
    (ILogic_P)Factory.CreateAnon("some.path.ILogic_P" + (SomeClass.isIMDB() ? "1" : "2"));

public static ILogic_P getLogicInstanceI(){
    return logicInstanceI;
}
我不知道静态变量的初始化是否是线程安全的。
两个线程是否有可能同时尝试初始化此属性?

答案如下:

因为Java编程语言是多线程的,所以类或接口的初始化需要仔细的同步,因为其他一些线程可能试图同时初始化同一个类或接口。还有一种可能性是,类或接口的初始化可能作为该类或接口初始化的一部分被递归地请求;例如,类
a
中的变量初始值设定项可能会调用不相关类
B
的方法,而该类
a
的方法又可能会被调用。Java虚拟机的实现负责使用以下过程进行同步和递归初始化。[……]

注意以“Java虚拟机的实现负责处理…”开头的最后一句话

因此,在类初始化的情况下,您不负责同步,并且将初始值分配给
静态
变量是类初始化的一部分,如中所述:

8.3.2. 字段初始化 如果字段声明中的声明符具有变量初始值设定项,则声明符具有声明变量赋值(§15.26)的语义

如果声明符用于类变量(即
静态
字段),则以下规则适用于其初始值设定项:

  • 在运行时,当类初始化时,对初始化器求值并执行一次赋值(§12.4.2)

静态实例在类加载期间初始化,并且每个类实例都“同步”。是的,这是线程安全的。我不喜欢那个复制品。呸..谢谢,现在已经很清楚了。当然,这确实假设JVM的同步没有任何错误。(通常是一个安全的假设,但并不意味着编译器和虚拟机就一定没有bug。)总有这样一种情况,在出现bug报告之前,没有人会进行测试。@JAB:如果你假设一个有bug的JVM,你无论如何都会迷失方向。谁说
synchronized
或任何用于线程安全的工具都能正常工作?但是正确的类初始化是JVM开发人员必须关心的最关键的事情之一…