论坛首页 入门技术论坛

我理解的单件模式

浏览 2387 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-13  
性能、安全最好的单件书写模式
public class Singleton{

//volatile 仅仅在JDK5+有效,跟同步块synchronized一起使用,可提高同步性能。如果读操作远远超过写操作,可以结合使用内部锁和 volatile 变量来减少公共代码路径的开销
    private volatile static Singleton test;

    private Singleton(){}

    public static Singleton getInstance(){
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }
        return test;
    }
}

注意: 1.单件必须保证使用同一个类加载器
         2. jdk1.2中的单件在无引用的情况下会被垃圾回收
         3. 单件类中必须使用静态变量,因为方法是静态的,而且方法必须是静态的
   发表时间:2009-08-14  
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢
0 请登录后投票
   发表时间:2009-08-14   最后修改:2009-08-14
引用
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

这个例子来看没有区别,都是对getInstance()加锁
并且
引用
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }

这种写法真的是莫明其妙的感觉

P.S.
volatile在JDK1.2就有了,何来只在JDK 5有效一说?
the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another.
0 请登录后投票
   发表时间:2009-08-14  
推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html

线程安全的单例模式
public class Singleton{
  private static Singleton instance = new Singleton();

  private Singleton(){
  }

  public static Singleton getInstance(){
    return instance;
  }
}
0 请登录后投票
   发表时间:2009-08-14  
有很大区别,做JVM有很多公司有很多,这其中有不少JVM是不支持volatile的(在JDK5之前),会导致双重枷锁失效,建议你听听你楼下的那位朋友的说法。

这种写法不是莫名其妙,好好研究~~

metaphy 写道
引用
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

这个例子来看没有区别,都是对getInstance()加锁
并且
引用
        if(test == null){
            synchronized(Singleton.class){
                if(test==null){
                    test = new Singleton();
                }
            }  
        }

这种写法真的是莫明其妙的感觉

P.S.
volatile在JDK1.2就有了,何来只在JDK 5有效一说?
the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another.

0 请登录后投票
   发表时间:2009-08-14  
有很大区别的,放在方法提上会让影响效率的,一个synchronized锁会让一个方法调用的效率降低100倍,放在方法体上同步会让每次调用都要采取同步机制,放在里面那样写,只有第一次并发需要同步,以就不需要同步了。

01404421 写道
public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢

0 请登录后投票
   发表时间:2009-08-14  
这样写的一个缺点是把变量实例化的全新交给了系统,有时候就算不调用,也会实例化,还有,如果实例化后还需要很多操作,才算产生一个真正的实例,这样也是不行的。

nextway.cn 写道
推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html

线程安全的单例模式
public class Singleton{
  private static Singleton instance = new Singleton();

  private Singleton(){
  }

  public static Singleton getInstance(){
    return instance;
  }
}

0 请登录后投票
论坛首页 入门技术版

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