Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从静态初始值设定项初始化对象引用以安全发布对象?_Java_Multithreading_Synchronization_Thread Safety - Fatal编程技术网

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();
我见过这样一种发布自定义可发布对象的方式,我读到这是安全的。我的问题是:

  • 这真的是一种安全的出版方式吗
  • 如果1的答案是否定的,那么为什么?如果是,请解释原因
  • 根据JCiP:

    静态初始值设定项由JVM在类初始化时执行[…],这种机制保证安全地发布以这种方式初始化的任何对象

    参考:-项目9:

    接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,就像它们是单个块一样

    根据JCiP:

    静态初始值设定项由JVM在类初始化时执行[…],这种机制保证安全地发布以这种方式初始化的任何对象

    参考:-项目9:

    接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,就像它们是单个块一样


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

    如果你能的话,我会让这场比赛成为决赛

     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用于提及延迟初始化