2012-07-03 72 views

回答

7

根据JCiP:

静态初始化通过在类初始化时JVM执行[...]这个机制是保证安全地发布这样初始化的任何对象。

参考:JLS 12.4.2 - 项目9:

接着,执行任一类变量初始化和类的静态初始化,或接口的字段初始化,在文本顺序,就好像它们是一个块。

+3

+1值得'可发布'最终确定它没有改变。 –

+0

@PeterLawrey尽管我明白你的观点,但这对安全出版本身并不是必需的。 – assylias

+0

@assylias by“class initialization”你的意思是“类加载”吗? – Inquisitive

3

所有从静态块运行或静态初始化的代码都是线程安全的。

如果可以的话,我会让字段最终确定。

public static final Publishable publishable= new Publishable(); 

甚至使可发布的枚举

public enum Publishable { 
     INSTANCE; 

} 
+0

您说过“所有代码都是从静态块运行或静态初始化是线程安全的”。但我的问题是为什么它是线程安全的? – Inquisitive

+1

查看assylias对标准的回答。你想知道为什么它是这样定义的吗? –

+0

是差不多的一些情况介绍会有助于 – Inquisitive

1

我不认为这是初始化这个对象(撇开字“安全”,这我可以解释的特别方式以可能的方式)。

它创建一个绑定到包含类的单例,并且初始化不受控制。或者说,只要该类加载,它就会初始化。你有完全的控制权吗?

我宁愿:

  1. 没有使用一个单身。请参阅here了解有关使用单例的困难的更多细节。我注意到你的问题是用线程相关的关键字标记的,而单身人士在线程创建自己的特定问题。
  2. 让客户端类控制此对象的初始化。您可能希望推迟此对象的初始化(想象一下,如果它突然变成重量级对象,在施工时执行网络调用等)。目前上面对此提供很少的控制。
+1

虽然我同意你的主要观点,但我认为在多线程环境下的“安全发布”是非常明确的。 – assylias

+0

@Brian +1提到延迟初始化 – Inquisitive