Java 分析JVM中作为常量构造的单例模式
我想通过以下方式使用单例模式:Java 分析JVM中作为常量构造的单例模式,java,design-patterns,jvm,Java,Design Patterns,Jvm,我想通过以下方式使用单例模式: public static final XXX INSTANCE = new XXX(); private XXX() {} 你能从JVM的角度分析结果吗?如果你有一个多线程的应用程序,你可能会遇到问题。这个职位可能会有所帮助 将单例初始化为最终静态字段是安全的。您需要记住,尽管构造本身是线程安全的,但它并不能增强内部代码的安全性 有时候单身是解决问题的正确方法,但我鼓励你一般远离他们 你试过了吗?你遇到什么问题了吗?没有。唯一的问题是您将无法
public static final XXX INSTANCE = new XXX();
private XXX() {}
你能从JVM的角度分析结果吗?如果你有一个多线程的应用程序,你可能会遇到问题。这个职位可能会有所帮助 将单例初始化为最终静态字段是安全的。您需要记住,尽管构造本身是线程安全的,但它并不能增强内部代码的安全性
有时候单身是解决问题的正确方法,但我鼓励你一般远离他们 你试过了吗?你遇到什么问题了吗?没有。唯一的问题是您将无法延迟加载它。但是对于大多数对象来说,这并不是必需的。除了下面提到的多线程问题之外,请注意,在Java中,同一个类可以在同一个VM中多次加载(例如,在web服务器中的单独战争中,如果该类不在服务器的类路径中)。Java中的单例不能保证是这样的,所以使用它们时要小心。可能重复的I将使用一个
enum
和一个instance.Hogwash。静态常量将在类加载时初始化,远远早于任何用户线程运行。@amalloy:threads?你的意思是说这种模式是线程安全的吗?如果是这样,当且仅当值是不可变的时,这才是真的。显然,如果他在构造单例后试图从多个线程调用mutator方法,他将遇到问题,就像线程访问任何对象一样。但是问题是关于初始化它,因为他没有尝试延迟加载它,tkcsam提到的线程是不相关的。