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

时间:2015-12-09 15:30:01

标签: 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;
}

如果静态变量的初始化是线程安全的话,我无法弄明白。 两个线程是否有可能尝试同时初始化此属性?

1 个答案:

答案 0 :(得分:3)

答案由Java Language Specification §12.4.2提供:

  

由于Java编程语言是多线程的,因此初始化类或接口需要仔细同步,因为其他一些线程可能正在尝试同时初始化同一个类或接口。作为该类或接口的初始化的一部分,还可以递归地请求类或接口的初始化;例如,类A中的变量初始化程序可能会调用不相关的类B的方法,该方法可能会调用类A的方法。 Java虚拟机的实现负责通过使用以下过程来处理同步和递归初始化。 [...]

请注意以“ Java虚拟机的实现负责照顾 ...”开头的最后一句话。

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

  

8.3.2。字段初始化

     

如果字段声明中的声明符具有变量初始值设定项,则声明符具有声明变量的赋值(第15.26节)的语义。

     

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

     

...

     
      
  • 在运行时,初始化程序初始化时(第12.4.2节)对初始化程序进行评估并执行一次。
  •