美文网首页Android面试
设计模式-单例模式

设计模式-单例模式

作者: JAY_DaYin | 来源:发表于2021-08-09 11:59 被阅读0次

    单例模式

    单例模式(Singleton Pattern)是 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;
     
     static{
     
       instance=new Singleton();
     }
    
     public static Singleton getInstance(){
     
        return instance;
     } 
    }
    

    3.懒汉式 (线程不安全)

     public class Singleton{
     
     private static Singleton singleton;
     
     private Singleton(){}
     
     public static Singleton getInstance(){
     
       if(singleton==null){
       
       singletion=new Singleton();
       }
       
       return singletion;
      }
     }
    

    4.懒汉式(线程安全 ,方法上加同步锁)
    获取实例的getInstance方法上加了同步锁,保证了多线程场景下的单例,效率会有折损

    public class Singleton{
    
     private static Singleton singleton;
     
     private Singleton(){}
     
     public static synchronized Singleton getInstance(){
    
          if(singleton==null){
          
            singleton=new Singleton();
          }
          return singleton;
     }
    }
    

    5.双重校验锁(线程安全,效率高)
    此种实现不用每次都需要获得锁,减少获得锁和等待的事件
    注意的volatile 关键字的使用,保证了各线程对singleton 静态实例修改的可见性

    
    public class Singleton{
    
    public volatile static Singleton singleton;
    
    private Singletion(){}
    
    public Singleton getInstance(){
    
            if(singleton==null){
    
                if(synchronized(Singleton.class)){
                 
                  if(slingleton==null){
                  
                    singleton=new Singleton();
                  }
                
                }
            }
           return singleton;
    }
    }
    

    6.静态内部类实现单例 (线程安全,效率高)
    这种方式Singleton 类被装载了,Instance 不一定被初始化,因为SingletonHolder 类没有被主动使用,只有通过显式调用getInstance 方法时,才会显式装载SingletonHolder类,从而实例化inatance;

    注意内部类SingletonHolder 要同static 进行修饰其中的静态变量INSTANCE 必须是final的

     
     public class Singleton{
     
      public class SingletonHolder{
      
        public static final Singleton INSTANCE=new Singleton();
      }
      
      private Singeton(){}
      
      public static final Singletion getInstance(){
      
        return SingletonHolder.INSTANCE;
      }
     }
    

    相关文章

      网友评论

        本文标题:设计模式-单例模式

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