锁定老帖子 主题:关于JAVA单例模式
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-15
双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
基础的东西,很容易想当然,如果莫枢在,会给出更详细的答案。 |
|
返回顶楼 | |
发表时间:2012-03-15
最后修改:2012-03-15
zxmzfbdc 写道 双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
jdk1.5后,使用volatile已经木有问题了 http://freish.iteye.com/blog/1008304 |
|
返回顶楼 | |
发表时间:2012-03-15
最大的问题是没有把构造函数设置成private的,这样就可以直接通过new来创建对象了,完全没有起到:单例的作用。
|
|
返回顶楼 | |
发表时间:2012-03-15
最后修改:2012-03-15
单例:确保一个类只有一个实例,并且提供一个安全的全局访问点。
PS:LZ构造函数没有显示私有化,肯定不是单例。 |
|
返回顶楼 | |
发表时间:2012-03-15
freish 写道 zxmzfbdc 写道 双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
jdk1.5后,使用volatile已经木有问题了 http://freish.iteye.com/blog/1008304 double lock checking 在jdk4以后就解决了,可以说是个bug |
|
返回顶楼 | |
发表时间:2012-03-15
哎。
高手们。仔细结合看了下,主要有以下错误了。 1。构造函数没有私有化。 没有私有化那就等于可以直接NEW直接创建对象了。 2。在多线程情况下应该要同步。 一帖收获甚多啊。。3Q 各位 |
|
返回顶楼 | |
发表时间:2012-03-15
Fkron 写道 哎。
高手们。仔细结合看了下,主要有以下错误了。 1。构造函数没有私有化。 没有私有化那就等于可以直接NEW直接创建对象了。 2。在多线程情况下应该要同步。 一帖收获甚多啊。。3Q 各位 一帮人不知道在讨论什么。 你最大的错误就是你这根本就不是单例啊。 你的st永远==null,永远都是return new Singleton(); 你们永远不测试吗? 一帮人全在讨论什么多线程,同步,你们没看到这短短几行的代码根本就不是单例吗?? public class Singleton { private static Singleton st; public static Singleton getInstance() { if (null == st) { return new Singleton(); } return st; } } |
|
返回顶楼 | |
发表时间:2012-03-16
wumingshi 写道 另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了 常量前置的写法if(null==smothing) 更好 if("abc".equals(abc)) 比 if(abc!=null && abc.equals("abc")) 更好 |
|
返回顶楼 | |
发表时间:2012-03-16
最后修改:2012-03-16
freish 写道 mfkvfn 写道 单例是相对的。并不能做到完全正确的单例,用户可以通过系列化再反系列化的方式得到多份示例。
只要没有implements Serializable就无法序列化的 即使实现这个接口了,在类里加入readResolve方法返回this即可保证反序列化不会得到多个实例 说得很对。但是一般人根本不会去写readResolve方法。 |
|
返回顶楼 | |
发表时间:2012-03-16
837062099 写道 楼主的函数错误有3点:
1.没有synchronized,现实中一般是多线程环境。 2.st没有赋值。不关调用方法多少次,st==null。 3.构造函数没有私有化。 |
|
返回顶楼 | |