单例模式的几种写法

懒汉式

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

缺点:

多线程情况下,容易被多个线程实例化出多个对象,违背”单例“的原则

线程安全的懒汉式

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

 线程安全且性能较好的懒汉式

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

饿汉式

public class Singleton {
    private Singleton() {
    }
 
    private static Singleton instance = new Singleton();
 
    public static Singleton getInstance() {
        return instance;
    }
 
}

 

双重检测

public class SingletonClass { 

  private volatile static SingletonClass instance = null; 

  public static SingletonClass getInstance() { 
    if (instance == null) { 
      synchronized (SingletonClass.class) { 
        if(instance == null) { 
          instance = new SingletonClass(); 
        } 
      } 
    } 
    return instance; 
  } 
}

你可能感兴趣的:(java)