当前位置:主页 > 查看内容

单例的几种实现方式

发布时间:2021-05-21 00:00| 位朋友查看

简介:使用单例需要注意的关键点 将构造函数访问修饰符设置为 private 通过一个 静态方法 或者 枚举 返回单例类对象 确保单例类的对象有且只有一个 特别是在多线程环境下 确保单例类对象在 反序列化 时不会重新构建对象 单例模式的几种写法 饿汉式静态常量 class S……

使用单例需要注意的关键点

  1. 将构造函数访问修饰符设置为private
  2. 通过一个静态方法或者枚举返回单例类对象
  3. 确保单例类的对象有且只有一个,特别是在多线程环境下
  4. 确保单例类对象在反序列化时不会重新构建对象

单例模式的几种写法

  1. 饿汉式(静态常量)
class Singleton{
    //1.构造器私有化,外部不能new
    private Singleton(){

    }

    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();

    //3.提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}
  1. 饿汉式(静态代码块)
class Singleton {
    //1.构造器私有化,外部不能new
    private Singleton() {

    }

    //2.本类内部创建对象实例
    private static Singleton instance;

    static {  //在静态代码块中,创建单例对象
        instance = new Singleton();
    }

    //3.提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 懒汉式(线程不安全)
class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    //提供一个静态的公有方法,当使用到方法时,才去创建instance
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 懒汉式(线程安全,同步方法)
class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    //提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 懒汉式(双重校验,线程安全,效率较高,推荐使用)
class Singleton {
    private static volatile Singleton instance;   //volatile保证线程间的可见性

    private Singleton() {
    }

    //提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题
    //同时保证了效率,推荐使用
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 静态内部类完成,推荐使用
class Singleton {
    private Singleton() {
    }

    //写一个静态内部类,该类中有一个静态属性Singleton
    //在调用getInstance()方法时,静态内部类才会被装载,保证了懒加载;同时类加载是线程安全的
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    //提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
  1. 使用枚举,推荐使用
enum Singleton{
    INSTANCE; //属性
    public void doSomething(){
        System.out.println("do something");
    }
}
;原文链接:https://blog.csdn.net/qq_35028940/article/details/115510972
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐