java 单例模式

来源:互联网 发布:shell curl post json 编辑:程序博客网 时间:2024/05/16 07:14

单例模式:确保一类最多只有一个实例,并提供一个全局访问点
列如:一个打印文件的类B, A类实例化B需要打印文件,C类实例化B需要打印文件,这样就会造成打印后的文件有A的东西还有C的东西;

实现方法: 1.用静态变量方式来实现 2. 程序员之间协商个全局变量

//打印文件类public class Singleton {    //静态变量    private static Singleton uniquInstance=null;    private Singleton(){    }    // 在本身类中实例化自己 如果A类第一次调用此方法 就先实例化   下次B调用此方法的时候直接返回A实例化uniquInstance  避免重复new 对象public static Singleton getInstance(){    if(uniquInstance==null){        uniquInstance=new Singleton();    }    return uniquInstance;}}
  • 经典单例模式的优化
  • 经典单例模式存在的多线程问题,并给出3种优化方案。

由于多线程执行是根据时间片的 如果A类调用getInstance()方法执行里面if(uniquInstance==null){方法的时候,系统把时间片给了B 那B类调用getInstance()方法执行里面if(uniquInstance==null){方法的时候就会new一个Singleton,然后A类执行的时候也new一个Singleton,这样就造成bug,

1.解决办法是给getInstance方法加一个同步锁synchronized

//打印文件类public class Singleton {    //静态变量    private static Singleton uniquInstance=null;    private Singleton(){    }//解决办法是给getInstance方法加一个同步锁synchronized public static synchronized Singleton getInstance(){    if(uniquInstance==null){        uniquInstance=new Singleton();    }    return uniquInstance;}}

2.直接一开始就实例化自己
不管那个线程调用getInstance 都是直接返回uniquInstance

//打印文件类public class Singleton {    //直接一开始就实例化自己    private static Singleton uniquInstance=new Singleton;    private Singleton(){    }//不管那个线程调用此方法 都是直接返回uniquInstancepublic static Singleton getInstance(){    if(uniquInstance==null){        uniquInstance=new Singleton();    }    return uniquInstance;}}
  • 3.
  • 这个就跟第一个方法差不多,不过比第一个更加节约消耗,synchronized 会造成消耗,这样加synchronized 的话就只会第一次new Singleton 的时候会用到同步锁,所以减少消耗。 第一个方法是没次调用getInstance的时候都会用到同步锁,如果线程多的话就会造成没必要的消耗
//打印文件类public class Singleton {    //静态变量    private static Singleton uniquInstance=null;    private Singleton(){    }public static Singleton getInstance(){    if(uniquInstance==null){        synchronized(Singleton.class){          if(uniquInstance==null){          uniquInstance=new Singleton();           }    }    }    return uniquInstance;}}
0 0