单例模式几种实现方式

来源:互联网 发布:活了一百万次的猫 知乎 编辑:程序博客网 时间:2024/05/14 08:49

除未经优化的懒汉式存在多线程环境下的线程安全问题,其它都可以在多线程环境下正常运行
静态内部类利用了java语言自带特性,未必适用于其它语言环境
单例模式构造函数为私有 故单例模式类不可被继承

1 . 饿汉式

public class Singleton {    private static Singleton instance = new Singleton();      //静态私有 成员变量 直接实例化    private Singleton(){}                   //私有 构造函数    public static Singleton getInstance(){  //静态公有 工厂方法        return instance;    }}

2 . 懒汉式 (未经优化 存在线程安全问题)

public class Singleton {    private static Singleton instance;      //静态私有 成员变量    private Singleton(){}                   //私有 构造函数    public static Singleton getInstance(){  //静态公有 工厂方法        if (instance == null)            instance = new Singleton();        return instance;    }}

3 . 工厂方法添加同步锁的懒汉式

public class Singleton {    private static Singleton instance;      //静态私有 成员变量    private Singleton(){}                   //私有 构造函数    synchronized public static Singleton getInstance(){  //静态公有 加同步锁 工厂方法        if (instance == null)            instance = new Singleton();        return instance;    }}

4 . 双重检查(double check)的懒汉式

public class Singleton {    //volatile关键字的两层语义:    //保证了不同线程对这个变量进行操作时的可见性    //禁止进行指令重排序    private volatile static Singleton instance;      //静态私有volatile 成员变量    private Singleton(){}                   //私有 构造函数    public static Singleton getInstance(){  //静态公有 工厂方法        if (instance == null){            synchronized (Singleton.class){ //对单独一句话加锁等于没加                if (instance == null)                    instance = new Singleton();            }        }                   return instance;    }}

5 . 静态内部类(java语言环境下最好的实现方式)

public class Singleton {    private Singleton(){}                   //私有 构造函数    private static class SingletonBuilder{  //静态内部类        private static Singleton instance = new Singleton();    }    public static Singleton getInstance(){        return SingletonBuilder.instance;    }}
0 0