Java 如何从静态初始值设定项初始化对象引用以安全发布对象?
考虑以下代码:Java 如何从静态初始值设定项初始化对象引用以安全发布对象?,java,multithreading,synchronization,thread-safety,Java,Multithreading,Synchronization,Thread Safety,考虑以下代码: // This code safely publishes the Publishable object public static Publishable publishable= new Publishable(); 我见过这样一种发布自定义可发布对象的方式,我读到这是安全的。我的问题是: 这真的是一种安全的出版方式吗 如果1的答案是否定的,那么为什么?如果是,请解释原因 根据JCiP: 静态初始值设定项由JVM在类初始化时执行[…],这种机制保证安全地发布以这
// This code safely publishes the Publishable object
public static Publishable publishable= new Publishable();
我见过这样一种发布自定义可发布对象的方式,我读到这是安全的。我的问题是:
从静态块运行或静态初始化的所有代码都是线程安全的 如果你能的话,我会让这场比赛成为决赛
public static final Publishable publishable= new Publishable();
或者甚至将其作为一个可发布的枚举
public enum Publishable {
INSTANCE;
}
从静态块运行或静态初始化的所有代码都是线程安全的 如果你能的话,我会让这场比赛成为决赛
public static final Publishable publishable= new Publishable();
或者甚至将其作为一个可发布的枚举
public enum Publishable {
INSTANCE;
}
我不认为这是初始化这个对象的一种特别好的方式(撇开“安全”这个词不谈,我可以用多种方式来解释它) 它正在创建一个绑定到包含类的单例,并且初始化不受控制。或者更确切地说,它会在该类加载后立即初始化。你能完全控制吗 我宁愿:
我不认为这是初始化这个对象的一种特别好的方式(撇开“安全”这个词不谈,我可以用多种方式来解释它) 它正在创建一个绑定到包含类的单例,并且初始化不受控制。或者更确切地说,它会在该类加载后立即初始化。你能完全控制吗 我宁愿:
+1值得使
可发布
最终版,以确保其不被更改。@PeterLawrey这对安全发布本身不是必要的,尽管我明白你的意思。@assylias“类初始化”是指“类加载”?Subhra类加载可以在没有初始化的情况下执行,但通常这两者是同时存在的。+1值得使可发布
最终版,以确保其不被更改。@PeterLawrey这对安全发布本身不是必要的,尽管我明白你的意思。@assylias的“类初始化”是指“类加载”?@Subhra类加载可以在没有初始化的情况下执行,但通常这两者都是假设在一起的,你说过“所有从静态块运行或静态初始化的代码都是线程安全的”。但我的问题是为什么它是线程安全的?请参阅assylias对标准的回答。你想知道为什么its是这样定义的吗?@Subhra:只需打开assylias提供的链接-第一段:-)@Peter+1以引入枚举构造,这是发布单例的最佳方式。@Subhra有时最简单的解决方案也是最好的。;)您说过“所有从静态块运行或静态初始化的代码都是线程安全的”。但我的问题是为什么它是线程安全的?请参阅assylias对标准的回答。你想知道为什么its是这样定义的吗?@Subhra:只需打开assylias提供的链接-第一段:-)@Peter+1以引入枚举构造,这是发布单例的最佳方式。@Subhra有时最简单的解决方案也是最好的。;)虽然我同意你的主要观点,但我认为在多线程上下文中“安全发布”是相当明确的。@Brian+1用于提及延迟初始化虽然我同意你的主要观点,但我认为在多线程上下文中“安全发布”是相当明确的。@Brian+1用于提及延迟初始化