单例模式

public class DoubleCheckSingleton {

  private volatile static DoubleCheckSingleton instance=null;

/****************************************************************************
* 说明:在getInstatnce()方法里,首先判断此事例是否已经被创建,如果还没有创建
* ,首先使用synchronized同步实例化代码快实例化代码快,在同步代码块里还需要再
* 次检查是否已经创建了此类的事例,这是因为:如果没有二次检查,这时有两个线程
* ThreadA和ThreadB同时进入该方法,它们都检测到instance为null,不管哪个线程先
* 占据同步锁创建事例对象,都不阻止另外一个线程继续进入实例化代码块重新创建事
* 例对象,这样会生成两个事例对象,所以,在同步代码块里进行第二次判断,判断该
* 对象是否已经被创建。 double-checked locking 模式
*
* volatile:具有synchronized的可见性特点,也就是说线程能够自动发现volatile变
* 量的最新值,这样,如果instance实例化成功,其他线程变能立即发现。
*
* @return
****************************************************************************/
  public static DoubleCheckSingleton getInstatnce(){
    if(instance == null){
      synchronized(DoubleCheckSingleton.class){ //synchronized creation block
        if(instance == null){ //double check if it is created
          instance = new DoubleCheckSingleton();
        }

      }
    }
    return instance;
  }
}

posted @ 2013-12-30 20:14  IT忍者  阅读(103)  评论(0编辑  收藏  举报