码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的三种实现方式

时间:2020-02-13 20:58:45      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:get   加载   public   ati   实现   volatile   singleton   添加   实例   

懒汉、饿汉、双重校验锁

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它的内部类变量(此种方式是线程安全的)

单例模式的三种实现方式

标签:get   加载   public   ati   实现   volatile   singleton   添加   实例   

原文地址:https://www.cnblogs.com/blackdd/p/12304529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!