论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52242 次
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
作者 正文
   发表时间:2012-03-14  
今天和一人讨论以下这几形式的单例,看这样写是否正确??
public class Singleton
{
    private static Singleton st;
    
    public static Singleton getInstance()
    {
        if (null == st)
        {
            return new Singleton();
        }
        return st;
    }
}



他说这样写不对。。晕了。。
   发表时间:2012-03-15   最后修改:2012-03-15
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。
0 请登录后投票
   发表时间:2012-03-15  
考虑lazy load的话,可以用double check技术。

不过double check有时候也不是100%线程安全的
0 请登录后投票
   发表时间:2012-03-15  
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。

“ if(null==smothing),应该if(something==null)”

这只是个习惯问题吧。。。跟左大括号是否另起一行是一样的性质
0 请登录后投票
   发表时间:2012-03-15   最后修改:2012-03-15
http://freish.iteye.com/blog/1008304
0 请登录后投票
   发表时间:2012-03-15  
请参考此条目:
http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
0 请登录后投票
   发表时间:2012-03-15  
Fkron 写道
今天和一人讨论以下这几形式的单例,看这样写是否正确??
public class Singleton
{
    private static Singleton st;
    
    public static Singleton getInstance()
    {
        if (null == st)
        {
            return new Singleton();
        }
        return st;
    }
}



他说这样写不对。。晕了。。


可能他是这个意思, 你每次都new一个新的对象那还叫单例么?
public class Singleton
{
    private static Singleton st;
    
    public static Singleton getInstance()
    {
        synchronize(Singleton.class){
            if (null == st)
            {
                st = new Singleton();
            }
        }
        return st;
    }
}

0 请登录后投票
   发表时间:2012-03-15  
楼主马虎了
0 请登录后投票
   发表时间:2012-03-15  
构造函数没有私有化。
1 请登录后投票
   发表时间:2012-03-15  
这就是一个坑
0 请登录后投票
论坛首页 Java企业应用版

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