单例模式的三种实现方式

懒汉、饿汉、双重校验锁

1、懒汉:需要时才会去创建

public Class Singleton{

  private static Singleton instance = null;

  private  Singleton(){}

  public static synchronized Singleton getInstance(){

    if( instance == null ){instance = new Singleton(); }

    return instance;

  }

}

2、饿汉:线程安全,类加载时就创建了实例

public Class Singleton{

  private static Singleton instance = new Singleton();

  private  Singleton(){}

  public static Singleton getInstance(){

    return instance;

  }

}

//饿汉方式可做变种,将实例放入静态代码块中:

static{

  instance  = new Singleton();

}

3、双重校验锁: volatile 修饰实例变量,同时synchronized同步方法

  在懒汉实现中,如果两个线程同时执行了if判断为null的情况,则会依次执行同步代码块里的代码,为避免创建两个实例,在同步代码块里添加if进行二重校验。

public Class Singleton{

  private static volatile Singleton instance = null;    //volatile是jdk1.5后才有的

  private  Singleton(){}

  public static  Singleton getInstance(){

    if( instance == null ){

      Synchronized(Singleton.class){

        if(instance == null){

          instance = new Singleton();

        }  

      }

     }

    return instance;

  }

}

另:还有静态内部类的实现方式,相当于把饿汉的创建实例方式提到内部类,在外部类getInstance方法内return它的内部类变量(此种方式是线程安全的)

posted on 2020-02-13 20:09  黑子菜园  阅读(576)  评论(0编辑  收藏  举报

导航