单例的几种实现方式

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

  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");     } } 

版权声明:玥玥 发表于 2021-04-09 16:18:47。
转载请注明:单例的几种实现方式 | 女黑客导航