美文网首页
单例模式

单例模式

作者: 内卷程序员 | 来源:发表于2022-09-29 14:00 被阅读0次

    定义

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    一、饿汉式-线程安全
    class Singleton{
          //1.构造器私有化,外部不能通过new来创建对象
          private Singleton(){}
          //2.本类内部创建对象实例在类加载的时候就会被创建,这里使用final是保证线程安全,final不可变对象
          private final static Singleton instance = new Singleton();
          //3.提供一个公有的静态方法,返回实例对象,通过调用方法来返回实例对象
          public static Singleton getInstance() {
                  return instance;
          }
    }
    
    二、懒汉式-非线程安全
    public class Singleton {
       private Singleton  instance;
       private Singleton (){}   
       //没有加入synchronized关键字的版本是线程不安全的
       public static Singleton getInstance() {
        //判断当前单例是否已经存在,若存在则返回,不存在则再建立单例
         if (instance== null) {  
            instance= new Singleton();  
         }  
         return instance;  
     }  
    
    三、懒汉式-线程安全
    public class Singleton {
       private Singleton  instance;
       private Singleton (){}   
       //没有加入synchronized关键字的版本是线程不安全的
       public static synchronized Singleton getInstance() {
        //判断当前单例是否已经存在,若存在则返回,不存在则再建立单例
         if (instance== null) {  
            instance= new Singleton();  
         }  
         return instance;  
     }  
    
    四、懒汉式-双重检查加锁
    public class Singleton {
     //volatile保证多线程可见性
      private volatile static Singleton instance;
      private Singleton() {  }
      public static Singleton getInstance() {
      //检查实例,如果不存在,就进入同步代码块
      if (instance == null) {
        //只有第一次才彻底执行这里的代码
        synchronized(Singleton.class) {
        //进入同步代码块后,再检查一次,如果仍是null,才创建实例
            if (instance == null) {
              instance = new Singleton();
            }
         }
       }
       return instance;
     }
    }
    
    五、懒汉式-静态内部类
    public class Singleton {
     private Singleton() {}
     public static Singleton getInstance() {
         return SingletonHolder.INSTANCE;
     }
     //静态内部类既可以能够确保延迟加载又能确保线程安全
     private static class SingletonHolder {
         private static final Singleton INSTANCE= new Singleton();
     }
    }
    
    六、枚举模式
    public enum Singleton {
     //从反编译后的代码分析, enum 对象编译之后的类使用饿汉式来保证的单例,枚举类型还有一个好处就是能够防止反射导致单例失效,比如Constructor的newInstance等方法
       INSTANCE;
       public Singleton getInstance() {
           return INSTANCE;
       }
    }
    

    相关文章

      网友评论

          本文标题:单例模式

          本文链接:https://www.haomeiwen.com/subject/mjojnrtx.html