单列模式几种方法分析

来源:互联网 发布:c语言静态变量定义 编辑:程序博客网 时间:2024/06/15 21:19

方法一:懒汉式(懒汉式对于单线程而言,推荐使用,但是对于多线程,可能会出现 数据不同步,也可能会创建出好几个对象,因此不建议使用)

public class SingleModelTwo {/** * volatile 内存可见性(直接写入主存)、指令重排序 * synchronized 实现代码的原子性  上下文切换 (耗时) 保证内存可见性  */private static  SingleModelTwo singleModelTwo=null;private SingleModelTwo(){};  /**   * 线程不安全   * @return   */public static SingleModelTwo getInstance(){if(singleModelTwo==null){singleModelTwo=new SingleModelTwo();}return singleModelTwo;}}
方法二:显示锁(由于在方法前边加了显示锁,因此在调用这个方法是,因此在多线程同时调用改方法时,它时一遍一遍执行,不能达到并发,效率低下
public class SingleModelTwo {private static  SingleModelTwo singleModelTwo=null;private SingleModelTwo(){}; /** * 线程安全 效率低下 * @return */public static synchronized SingleModelTwo getInstanceTwo(){if(singleModelTwo==null){singleModelTwo=new SingleModelTwo();}return singleModelTwo;}
方法三:双重检验锁(它在判断singleModelTwo为空之后加了显示锁,当该方法第一次执行完成之后,singleModel已经不为空,因此再次调用时,显示锁代码不被调用,所以效率相对方法二有所提高,推荐使用

public class SingleModelTwo {private static  SingleModelTwo singleModelTwo=null;private SingleModelTwo(){};  /** * 线程安全  效率相对较低 * 双重检验锁 */ public  static SingleModelTwo getInstanceThree(){if (singleModelTwo==null)    synchronized (SingleModelTwo.class){if(singleModelTwo==null){singleModelTwo=new SingleModelTwo();         }} return singleModelTwo; }}

方法四:饿汉式(它直接在类里边将对象实例化,速度快,这样在不加锁的情况下保证了线程安全,但是由于没有延缓机制,所以在多线程并发的情况下,可能会过度消耗JVM内存,使得运行效率变低。。。。。有时候在不使用改类对象时,而是用其他静态方法,这个时候实例化对象也是没有用的,只能增加JVM开销)

public class SingleModelOne {    //饿汉式    private static SingleModelOne singleModel=new SingleModelOne();     /**      * 构造器私有      */    private SingleModelOne(){};    public static SingleModelOne getInstanceSingleModel(){    return singleModel;  }}
方法五:静态内部类( 它是在饿汉式基础之上,增加静态内部类是现实延迟加载,保证JVM内存不被过度消耗,速度快, 推荐使用)


public class SingleModelThree {/** * 静态内部类 * @return */public static SingleModelThree getInstance(){return GetSingle.modelThree;}    private SingleModelThree(){}public static class GetSingle{private static final SingleModelThree modelThree=new SingleModelThree();}}

注:最后在提一点,在网上看到有用枚举的,但是我觉得不是很常用,在此也没有做过多研究。

        静态方法以及静态变量都是在类加载时被一起加载的,所以说有时候你用类对象第一次去调用静态方法,其他方法也会被架子啊




1 0
原创粉丝点击