论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52253 次
精华帖 (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;
    }
}




0 请登录后投票
   发表时间:2012-03-16   最后修改:2012-03-16
关于单例模式,请参考该文:http://soongbo.iteye.com/admin/blogs/1343683
0 请登录后投票
   发表时间:2012-03-16  
最基本的一点,先要把构造函数私有化
0 请登录后投票
   发表时间: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; 
    } 
}
0 请登录后投票
   发表时间:2012-03-16  
mfkvfn 写道
单例是相对的。并不能做到完全正确的单例,用户可以通过系列化再反系列化的方式得到多份示例。


系列化 彻底被你打败了。。
0 请登录后投票
   发表时间:2012-03-16  
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

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



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。
0 请登录后投票
   发表时间:2012-03-16  
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

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



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。

Object smothing = null
if(smothing == null) {
//
}

上面的代码会空指针?扯淡
0 请登录后投票
   发表时间: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;
        }
}
0 请登录后投票
   发表时间:2012-03-17  
1、你没有加受保护的构造方法
2、没有进行同步
3、没有对成员变量赋值,你返回的st永远是null
0 请登录后投票
   发表时间:2012-03-17  
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

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



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。



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

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