【发布时间】:2012-01-11 00:30:04
【问题描述】:
我原以为下面的类是线程安全的单例,但阅读 http://taskinoor.wordpress.com/2011/04/18/singleton_multithreaded/ 似乎不是。
public class ThreadSafeSingleton {
private static ThreadSafeSingleton ref;
private ThreadSafeSingleton(){
}
public ThreadSafeSingleton getSingletonObject(){
if(ref == null){
ref = new ThreadSafeSingleton();
}
return ref;
}
}
根据文章,唯一真正线程安全的单例是 -
public class ThreadSafeSingleton {
private static ThreadSafeSingleton ref = new ThreadSafeSingleton();
private ThreadSafeSingleton(){
}
public ThreadSafeSingleton getSingletonObject(){
return ref;
}
}
这样对吗?
【问题讨论】:
-
请检查右侧栏中的“相关”列表(顺便说一下,这与您输入问题标题后出现的列表完全相同)。当然这个问题之前已经被问过无数次了:)
-
绝对不是唯一的线程安全方式,甚至不是最好的线程安全方式。确实,顶部不是线程安全的,而底部似乎是。
-
我的理解是,底层解决方案是“最好的”线程安全的单例实现(尽管最好的可能取决于特定的用例)。 Glowcoder,你推荐哪种方式更好?
-
@increment 你如何定义“最佳”?不同的解决方案有不同的权衡。如果您以后只需要该对象,这当然不是昂贵的初始化的最佳选择。
-
@user470184,这不是实现线程安全单例的唯一方法。博客里没有说。有许多特定于平台的解决方案,在博客文章的末尾简要描述了这些解决方案。特别是,如果您使用 J2SE 5.0 或更高版本,则可以将
volatile与 DCLP 一起使用,因此也可以进行延迟初始化。
标签: java design-patterns singleton