锁定老帖子 主题:关于java单例模式双重检测
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-26
最后修改:2010-04-26
http://www.iteye.com/topic/652440中说,单例模式的双重检测由于java的无序写入
junJZ_2008在会造成失败,那把原帖中的第三种方法该成,如下方式,是否还会失败? public class Singleton { private volatile static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) {// 1 if (instance == null) {// 2 instance = new Singleton();// 3 //在这里直接返回 return instance; } } } return instance; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-26
应该没问题吧!!
|
|
返回顶楼 | |
发表时间:2010-04-27
一般用饿汉式
|
|
返回顶楼 | |
发表时间:2010-04-28
这个和原来的实现方式没有一点区别。
|
|
返回顶楼 | |
发表时间:2010-04-28
双重检查是不可靠的,所以最好还是用哪个所谓的饱汉模式,就是先在类内部new一个private对象,然后将类的构造函数设为private,用一个public的方法返回那个对象。
|
|
返回顶楼 | |
发表时间:2010-04-28
没问题,volatile的语义保证了以volatile声明过的变量不会参与指令的重排序。
但好像只有jdk1.4以后的JMM才保证了volatile重排序问题,所以最好还是采用内部类的方式来初始化。 |
|
返回顶楼 | |
发表时间:2010-04-28
JDK 1.5中的volatile是可以的
如果非要延时加载的话,其实可以这样 public class Singleton { private static class SingletonHolder { static final Singleton s = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.s; } } |
|
返回顶楼 | |
发表时间:2010-04-28
用枚举来实现单例模式
|
|
返回顶楼 | |
发表时间:2010-04-28
看着应该是没问题..
|
|
返回顶楼 | |
发表时间:2010-04-28
在1.5以上的版本加上 volatile 是可以保证引用赋值和构造方法的顺序的,所以可以安全运行
|
|
返回顶楼 | |