2021-01-06

【设计模式】单例模式(Singleton Pattern)

  • 懒汉式
public class Singleton {  private static Singleton instance;  private Singleton() {};  public static synchronized Singleton getInstance() {   if (instance == null) {     instance = new Singleton();   }   return instance;  }}

首次调用时进行初始化;
synchronized加锁保证线程安全;

  • 饿汉式
public class Singleton {  private static Singleton instance = new Singleton();  private Singleton() {};  public static Singleton getInstance() {   return instance;  }}

类加载时就实例化,避免了多线程同步问题,不需要加锁;

  • 双重校验锁(DCL, double checked locking)
public class Singleton {  private volatile static Singleton instance;  private Singleton() {};  public static Singleton getInstance() {   if (instance == null){     synchronized (Singleton.class) {      if (instance == null){        instance = new Singleton();      }     }   }   return instance;  }}

首次调用时进行初始化;
volatile关键字保证了变量在多线程下的可见性以及防止指令重排;
通过加锁和两次校验是否实例化避免多线程多次创建实例的问题;如:
当实例未被创建时,线程t1调用getInstance方法,第一次判断instance==null为真,继续执行,进入同步代码块。在t1创建实例之前,线程t2也调用了getInstance方法,并且由于实例还未被创建,t2同样可以通过第一个if,继续往下执行。t1创建完实例后退出同步代码块,t2进入,此时,如果没有第二个if,那么t2也会创建一个实例,但是加上第二个if,就可以避免这个多线程多次创建实例的问题。

  • 静态内部类
public class Singleton {  private static class SingletonHolder {   private static final Singleton INSTANCE = new Singleton();  }  private Singleton() {};  public static final Singleton getInstance() {   return SingletonHolder.INSTANCE;  }}

利用类加载机制避免多线程同步问题;
静态内部类延迟了初始化,只有调用getInstance方法时才会加载内部类,从而实例化;









原文转载:http://www.shaoqun.com/a/506040.html

跨境电商:https://www.ikjzd.com/

急速:https://www.ikjzd.com/w/1861

李群:https://www.ikjzd.com/w/1767


懒汉式publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){};publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}首次调用时进行初始化;synch
跨境通:跨境通
hts:hts
让你垂涎的【四川美食】 - :让你垂涎的【四川美食】 -
历溪好玩吗?祁门历溪风景区怎么样?:历溪好玩吗?祁门历溪风景区怎么样?
别再看仓库起火了!过年回来你连FBA仓库都进不去…:别再看仓库起火了!过年回来你连FBA仓库都进不去…

No comments:

Post a Comment