首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

小弟我理解的单件模式

2012-10-26 
我理解的单件模式性能、安全最好的单件书写模式public class Singleton{//volatile 仅仅在JDK5+有效,跟同步

我理解的单件模式
性能、安全最好的单件书写模式
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. 单件类中必须使用静态变量,因为方法是静态的,而且方法必须是静态的 1 楼 01404421 2009-08-14   public static synchronized Singleton getInstance(){
    return test==null?(new Singleton()):test;
    }
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 2 楼 metaphy 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. 3 楼 nextway.cn 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;
  }
}
4 楼 xiaoqulai 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.
5 楼 xiaoqulai 2009-08-14   有很大区别的,放在方法提上会让影响效率的,一个synchronized锁会让一个方法调用的效率降低100倍,放在方法体上同步会让每次调用都要采取同步机制,放在里面那样写,只有第一次并发需要同步,以就不需要同步了。

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

热点排行