Android面试

设计模式-单例模式

2021-08-09  本文已影响0人  JAY_DaYin

单例模式

单例模式(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;
  }
 }
上一篇下一篇

猜你喜欢

热点阅读