锁定老帖子 主题:单例模式(Singleton)
精华帖 (0) :: 良好帖 (4) :: 新手帖 (19) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-16
如果singleton这个class里面的东东都是对象的方法或变量,就没有必要lazy了吧,必须通过getinstance来使用里面的方法,所以类加载时初始化就可以了,没人用到这个类自然不会加载,除非有其他的static成员
|
|
返回顶楼 | |
发表时间:2010-06-17
Agrael 写道 双重锁定在java里一定要保证可见性,你的例子里没保证这一点额。
兄台说的可见性,是否是使用声明称“Volatile ”? |
|
返回顶楼 | |
发表时间:2010-06-17
slaser 写道 LZ,你的double-checking lock 是错误的。
new Singleton()不是一个atomic的操作。 你的instance可能处于一个不是null,但是又不是完整对象的状态。 这样会导致程序崩溃。 你说的很对!我以前没有意识到这一点,多线程没有想到线程的中断和独占问题!谢谢你的提醒! |
|
返回顶楼 | |
发表时间:2010-06-17
silence1214 写道 double check出来很久了吧 怎么又搞出来了。
前车之鉴还是得学习的嘛! |
|
返回顶楼 | |
发表时间:2010-06-17
kraft 写道 如果singleton这个class里面的东东都是对象的方法或变量,就没有必要lazy了吧,必须通过getinstance来使用里面的方法,所以类加载时初始化就可以了,没人用到这个类自然不会加载,除非有其他的static成员
所谓的加载,是在程序一启动的时候加载还是在访问的时候加载!在程序一启动的时候就加载该类对象实例,该实例中包含的所有的有用信息,如果类很庞大的话,启动速度当然会很慢(对该类实例化耗费时间),而耗费了很大力气初始化好了该对象实例,但是用它的时候很迟很迟,可以说是在将来很长一段时间,都不会用到该类的实例,但是他却一直在contain中,是不是很耗资源呢?而在其访问的时候去加载它,虽然加载的时候会消耗一部分时间,但是换来了以前所有资源的节约,你说有没有必要实行延迟加载呢? |
|
返回顶楼 | |
发表时间:2010-06-17
最后修改:2010-06-17
“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; } }
|
|
返回顶楼 | |
发表时间:2010-06-17
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; } }
这个不能保证是延迟加载,而是饿汉方式!是为了解决双重锁定问题! |
|
返回顶楼 | |
发表时间:2010-06-17
最后修改:2010-06-17
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; } } |
|
返回顶楼 | |
发表时间:2010-06-17
最后修改:2010-06-17
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的时候才创建对象的。 我觉得是相对而言,思维上的理解,不是绝对的没有创建对象,也不是绝对的延迟加载!不知道我理解的对不对!还望大家指教!
|
|
返回顶楼 | |
发表时间:2010-06-17
由于classloader使用了一次而不是二次.
当然如果classloader使用了二次.....这个也是不安全的. |
|
返回顶楼 | |