论坛首页 Java企业应用论坛

关于java单例模式双重检测

浏览 6558 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2010-04-26   最后修改:2010-04-26
junJZ_2008在http://www.iteye.com/topic/652440中说,单例模式的双重检测由于java的无序写入
会造成失败,那把原帖中的第三种方法该成,如下方式,是否还会失败?

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;
 }
}
   发表时间:2010-04-26  
应该没问题吧!!
0 请登录后投票
   发表时间:2010-04-27  
一般用饿汉式
0 请登录后投票
   发表时间:2010-04-28  
这个和原来的实现方式没有一点区别。
0 请登录后投票
   发表时间:2010-04-28  
双重检查是不可靠的,所以最好还是用哪个所谓的饱汉模式,就是先在类内部new一个private对象,然后将类的构造函数设为private,用一个public的方法返回那个对象。
0 请登录后投票
   发表时间:2010-04-28  
没问题,volatile的语义保证了以volatile声明过的变量不会参与指令的重排序。
但好像只有jdk1.4以后的JMM才保证了volatile重排序问题,所以最好还是采用内部类的方式来初始化。
0 请登录后投票
   发表时间: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;
	}
	
}
0 请登录后投票
   发表时间:2010-04-28  
用枚举来实现单例模式
0 请登录后投票
   发表时间:2010-04-28  
看着应该是没问题..
0 请登录后投票
   发表时间:2010-04-28  
在1.5以上的版本加上 volatile   是可以保证引用赋值和构造方法的顺序的,所以可以安全运行
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics