【发布时间】:2011-02-24 03:10:41
【问题描述】:
我知道 Java 中的双重锁定已被破坏,那么在 Java 中使单例线程安全的最佳方法是什么?我首先想到的是:
class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null) instance = new Singleton();
return instance;
}
}
这行得通吗?如果是这样,这是最好的方法吗(我想这取决于具体情况,所以说明什么时候一种特定的技术是最好的,会很有用)
【问题讨论】:
-
将
return new Singleton()更改为instance = new Singleton() -
哎呀,好发现!未经测试就写...
-
有人能告诉我为什么人们如此关注单例的延迟初始化吗?
他们的使用模式是,使用这个例子: Singleton.getInstance( )。在 99% 的情况下,应该没有其他理由在不调用其getInstance方法的情况下加载 Singleton 类。如果instance是static final,那么它将在加载 Singleton 类时被初始化,并且是线程安全的。虽然LazyHolder模式确实有效,但我认为这是不必要的矫枉过正和反模式,而且单例本身就是反模式。 -
当然,如果它的创建成本很高,那么有时在负载上构建的成本太高,因为即使从未使用过对象也会留在堆上。
-
@罗伯特。这才是重点。加载单例类的唯一原因是立即调用
getInstance。如果没有这个调用,就绝对不需要加载单例类。
标签: java multithreading singleton