锁定老帖子 主题:关于JAVA单例模式
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-16
最后修改:2012-03-16
Fkron 写道 今天和一人讨论以下这几形式的单例,看这样写是否正确??
public class Singleton { private static Singleton st; public static Singleton getInstance() { if (null == st) { return new Singleton(); } return st; } } 他说这样写不对。。晕了。。 方式一: public class Singleton { private static Singleton st; public synchronized static Singleton getInstance() { if (null == st) { st = new Singleton(); } return st; } } 方式二: public class Singleton { private static Singleton st =new Singleton(); public static Singleton getInstance() { return st; } } 方式三: public class Singleton { private static Singleton st; public static Singleton getInstance() { if (null == st) { synchronized(Singleton.class){ if (null == st) { st = new Singleton(); } } return st; } } |
|
返回顶楼 | |
发表时间:2012-03-16
最后修改:2012-03-16
关于单例模式,请参考该文:http://soongbo.iteye.com/admin/blogs/1343683
|
|
返回顶楼 | |
发表时间:2012-03-16
最基本的一点,先要把构造函数私有化
|
|
返回顶楼 | |
发表时间:2012-03-16
public class Singleton
{ private static Singleton st; private Singleton(){ } public synchronized static Singleton getInstance() { if (null == st) { st = new Singleton(); } return st; } } |
|
返回顶楼 | |
发表时间:2012-03-16
mfkvfn 写道 单例是相对的。并不能做到完全正确的单例,用户可以通过系列化再反系列化的方式得到多份示例。
系列化 彻底被你打败了。。 |
|
返回顶楼 | |
发表时间:2012-03-16
wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 |
|
返回顶楼 | |
发表时间:2012-03-16
xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 Object smothing = null if(smothing == null) { // } 上面的代码会空指针?扯淡 |
|
返回顶楼 | |
发表时间:2012-03-17
public class Singleton(){
private volatile static Singleton singleton; private Sington(){}; public static Singleton getInstance(){ if(singleton == null){ synchronized (Singleton.class); if(singleton == null){ singleton = new Singleton(); } } } return singleton; } } |
|
返回顶楼 | |
发表时间:2012-03-17
1、你没有加受保护的构造方法
2、没有进行同步 3、没有对成员变量赋值,你返回的st永远是null |
|
返回顶楼 | |
发表时间:2012-03-17
xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 嗯。+1 |
|
返回顶楼 | |