锁定老帖子 主题:单例模式(Singleton)
精华帖 (0) :: 良好帖 (4) :: 新手帖 (19) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-18
最后修改:2010-06-18
beneo 写道 myumen 写道 搜索到个更牛的写法,既满足Lazy load,又满足只有一个实例,即使多线程环境也是一个实例。
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } } 这个的确牛 Apache就是这么实现的,不过SingletonHolder是私有内部静态类... |
|
返回顶楼 | |
发表时间:2010-08-26
BestUpon 写道
gstarwd 写道
BestUpon 写道
gstarwd 写道
“new Singleton()不是一个atomic的操作。 ”
这样的操作在java中多么? 为什么这个能保证延迟加载呢? BestUpon 写道
/** *使用 static 字段的单例实现 **/ class Singleton { private Vector v; private boolean inUse; private static Singleton instance = new Singleton();//这个为什么能保证延迟加载呢》? private Singleton() { v = new Vector(); inUse = true; //... } public static Singleton getInstance() { return instance; } }
这个不能保证是延迟加载,而是饿汉方式!是为了解决双重锁定问题! 那么这个 为什么能呢?(我是提问的语气哦。。。不是反问的语气 - =) public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
你说的这种写法我也是第一次见:我的理解是这样的
public class Singleton { static class SingletonHolder { //静态内部类 static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } } 静态类在一开始就初始化好了,并且该静态类包含在Singleton这个类中,调用 getInstance()的时候返回的是SingletonHolder.instance;这个过程是相对而言的,意思是说,Singleton 这个类没有在初始化的时候 创建对象,而是创建了一个内部类的SingletonHolder,让他去创建Singleton的一个对象,这样在思维和逻辑上,Singleton在初始化的时候没有创建对象,而是在get的时候才创建对象的。 我觉得是相对而言,思维上的理解,不是绝对的没有创建对象,也不是绝对的延迟加载!不知道我理解的对不对!还望大家指教!
我认为应该是延迟加载(当然我不知道对不对,如果错了,请大家指出来):首先jvm在启动的时候不会加载 SingletonHolder 这个静态内部类,也就说程序先执行 getInstance(),然后转到 SingletonHolder.instance()里面,然后方法里面有 new关键字,也就是jvm在这个时候加载 Singleton ,所以我觉得应该是延迟加载
|
|
返回顶楼 | |
发表时间:2010-08-27
myumen 写道 搜索到个更牛的写法,既满足Lazy load,又满足只有一个实例,即使多线程环境也是一个实例。
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } } 怎么还这么多人不知道这个?老早就在je看到过了 参见http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom 个人理解: 原因:类在调用getInstance方法才会初始化(并非实例化)SingletonHolder,并且该过程是由jvm来保证其单线程执行的 sun的初始化的描述 A class or interface type T will be initialized immediately before the first occurrence of any one of the following: T is a class and an instance of T is created. T is a class and a static method declared by T is invoked. A static field declared by T is assigned. A static field declared by T is used and the field is not a constant variable (§4.12.4). T is a top-level class, and an assert statement (§14.10) lexically nested within T is executed. |
|
返回顶楼 | |
发表时间:2010-11-10
大家都打个例子 自己试下就知道执行顺序了。
|
|
返回顶楼 | |
发表时间:2010-11-10
Enum.instance
|
|
返回顶楼 | |