论坛首页 Java企业应用论坛

java单例模式(Singleton pattern)

浏览 11876 次
精华帖 (2) :: 良好帖 (2) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-27   最后修改:2010-04-27
weiqiang.yang 写道
public class Singleton {
    private class SingletonHolder {
	    final static Singleton INSTANCE = new Singleton();
    }

    private Singleton (){
    }

    public Singleton getInstance() {
	    return SingletonHolder.INSTANCE;
    }
}


之前看过的某solution,jvm加载SingletonHolder的时候会初始化INSTANCE,所以既是lazy的又保证是单例的



你这段代码似乎都无法编译!至少我这里提示“INSTANCE”不能定义成为static。

我做了一下修改:
public class Singleton {
	
	private static class SingletonHolder {
		final static Singleton INSTANCE = new Singleton();
	}

	private Singleton() {
	}

	public static Singleton getInstance() {
		return SingletonHolder.INSTANCE;
	}
}


一个小测试:
public class SingletonTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1==s2);

	}

}

输出结果 : true
0 请登录后投票
   发表时间:2010-04-27  
weiqiang.yang 写道
public class Singleton {
    private class SingletonHolder {
	    final static Singleton INSTANCE = new Singleton();
    }

    private Singleton (){
    }

    public Singleton getInstance() {
	    return SingletonHolder.INSTANCE;
    }
}


之前看过的某solution,jvm加载SingletonHolder的时候会初始化INSTANCE,所以既是lazy的又保证是单例的



private class SingletonHolder {
    final static Singleton INSTANCE = new Singleton();
    }
这里错了,这个INSTANCE不能定义成static的吧。
0 请登录后投票
   发表时间:2010-04-27  
JAVA和C,C++不同。它是java的无序写入的,所以双重检查成例在JAVA中是不成立的。
0 请登录后投票
   发表时间:2010-04-27   最后修改:2010-04-27
hiqrf 写道
JAVA和C,C++不同。它是java的无序写入的,所以双重检查成例在JAVA中是不成立的。

下面这段话摘自:Java 理论与实践: 正确使用 Volatile 变量
地址:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
引用
在缺乏同步的情况下,可能会遇到某个对象引用的更新值(由另一个线程写入)和该对象状态的旧值同时存在。这就是造成著名的双重检查锁定(double-checked-locking)问题的根源,其中对象引用在没有同步的情况下进行读操作,产生的问题是您可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象。实现安全发布对象的一种技术就是将对象引用定义为 volatile 类型。


我在很多参考书上或网上文章看到的在jdk1.5以后都是使用volatile关键字来解决"双重检查锁定"这种问题的,至于其中原理的东西我也没搞明白,希望清楚的赐教!

不过大家可以参考一下
引用
junJZ_2008 的文章"主题:单例模式与双重检测":http://www.iteye.com/topic/652440

本人愚笨,没有完全看懂这篇大作!不过在单例模式的双重检查锁定这一块写得很是明白!

0 请登录后投票
   发表时间:2010-04-30  
xiangdefei 写道
weiqiang.yang 写道
public class Singleton {
    private class SingletonHolder {
	    final static Singleton INSTANCE = new Singleton();
    }

    private Singleton (){
    }

    public Singleton getInstance() {
	    return SingletonHolder.INSTANCE;
    }
}


之前看过的某solution,jvm加载SingletonHolder的时候会初始化INSTANCE,所以既是lazy的又保证是单例的



private class SingletonHolder {
    final static Singleton INSTANCE = new Singleton();
    }
这里错了,这个INSTANCE不能定义成static的吧。


嗯,试了下
确实是的,没有验证就贴上来了,真不好意思~~
0 请登录后投票
论坛首页 Java企业应用版

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