单例模式几种实现

来源:互联网 发布:网络传播推广方案 编辑:程序博客网 时间:2024/06/05 11:54

1.单线程模式下,推荐懒加载

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

2.上述1演示,线程不安全,最容易想到的变为线程安全的方式就是加关键字synchronized

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

3.“双重检查锁”(Double Check Lock,简称DCL)

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

4.由于指令重排,上述3,仍然可能不安全,volatile关键字可以解决此问题

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

5.饿汉模式

public class Singleton2 {  private static final Singleton2 singleton = new Singleton2();  private Singleton2() {  }  public static Singleton2 getInstance() {    return singleton;  }}
原创粉丝点击