我想将以下代码添加到我的课程中:
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;
}
如果静态变量的初始化是线程安全的话,我无法弄明白。 两个线程是否有可能尝试同时初始化此属性?
答案 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节)对初始化程序进行评估并执行一次。