2013-06-05 14 views
-2

我想通过这种方式来使用Singleton模式:分析JVM Singleton模式被修建为一个常数

public static final XXX INSTANCE = new XXX(); 

    private XXX() {} 

你可以分析从JVM的角度后果?

+1

你试过了吗?你遇到过任何问题吗? – Makoto

+0

没有。唯一的问题是你将无法延迟加载它。但对大多数物体来说这不是必需的。 – Thihara

+0

除了下面提到的多线程问题之外,请注意,在Java中,同一个类可能会在同一个VM中多次加载(例如,在Web服务器中的单独WAR中,如果类不是'存在于服务器的类路径中)。 Java中的单例不能保证是这样的,所以要小心你使用它们的方式。 –

回答

2

如果您有多线程应用程序,则可能会遇到问题。这篇文章可能有帮助。 Thread Safe Singleton

+0

Hogwash。在任何用户线程运行之前,静态常量将在类加载时初始化。 – amalloy

+0

@amalloy:线程?你的意思是建议这种模式是线程安全的吗?如果是这样,当且仅当该值不可变时,这才是真的。 – scottb

+0

很显然,如果他在构造单例后尝试从多个线程调用mutator方法,他将遇到问题,就像使用线程访问任何对象一样。但是问题在于初始化它,并且由于他不试图延迟加载它,tkcsam提到的线程是无关紧要的。 – amalloy

2

将单例初始化为最终静态字段是安全的。您需要牢记的是,虽然构造本身是线程安全的,但并不会加强内部代码的安全性。

有时单身人士是解决问题的正确方法,但我会鼓励你远离他们。 It makes usually testing harder, if nothing else.