精华帖 (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 |
|
返回顶楼 | |
发表时间: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的吧。 |
|
返回顶楼 | |
发表时间:2010-04-27
JAVA和C,C++不同。它是java的无序写入的,所以双重检查成例在JAVA中是不成立的。
|
|
返回顶楼 | |
发表时间: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
本人愚笨,没有完全看懂这篇大作!不过在单例模式的双重检查锁定这一块写得很是明白! |
|
返回顶楼 | |
发表时间: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的吧。 嗯,试了下 确实是的,没有验证就贴上来了,真不好意思~~ |
|
返回顶楼 | |