论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52180 次
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
作者 正文
   发表时间:2012-03-15  
双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
基础的东西,很容易想当然,如果莫枢在,会给出更详细的答案。
0 请登录后投票
   发表时间:2012-03-15   最后修改:2012-03-15
zxmzfbdc 写道
双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。

jdk1.5后,使用volatile已经木有问题了

http://freish.iteye.com/blog/1008304
0 请登录后投票
   发表时间:2012-03-15  
最大的问题是没有把构造函数设置成private的,这样就可以直接通过new来创建对象了,完全没有起到:单例的作用。
0 请登录后投票
   发表时间:2012-03-15   最后修改:2012-03-15
单例:确保一个类只有一个实例,并且提供一个安全的全局访问点。
  • 如果对多线程没有要求,可以直接在静态方法中创建。
  • 如果存在资源竞争,采用“饿汉”方式创建(在类变量上初始化)。
  • 如果jdk4之后,可有采用double checked locking
  • 写在枚举中也可以,原理不解释,反编译下就知道了。


PS:LZ构造函数没有显示私有化,肯定不是单例。
0 请登录后投票
   发表时间:2012-03-15  
freish 写道
zxmzfbdc 写道
双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。

jdk1.5后,使用volatile已经木有问题了

http://freish.iteye.com/blog/1008304

double lock checking 在jdk4以后就解决了,可以说是个bug
0 请登录后投票
   发表时间:2012-03-15  
哎。
高手们。仔细结合看了下,主要有以下错误了。
1。构造函数没有私有化。
    没有私有化那就等于可以直接NEW直接创建对象了。
2。在多线程情况下应该要同步。

一帖收获甚多啊。。3Q 各位
0 请登录后投票
   发表时间: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; 
        } 
    } 
0 请登录后投票
   发表时间:2012-03-16  
wumingshi 写道

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了


常量前置的写法if(null==smothing) 更好
if("abc".equals(abc)) 比 if(abc!=null && abc.equals("abc")) 更好
0 请登录后投票
   发表时间:2012-03-16   最后修改:2012-03-16
freish 写道
mfkvfn 写道
单例是相对的。并不能做到完全正确的单例,用户可以通过系列化再反系列化的方式得到多份示例。

只要没有implements Serializable就无法序列化的

即使实现这个接口了,在类里加入readResolve方法返回this即可保证反序列化不会得到多个实例


说得很对。但是一般人根本不会去写readResolve方法。
0 请登录后投票
   发表时间:2012-03-16  
837062099 写道
楼主的函数错误有3点:
1.没有synchronized,现实中一般是多线程环境。
2.st没有赋值。不关调用方法多少次,st==null。
3.构造函数没有私有化。


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics