故事背景
故事发生在前几天,小张去某一家公司面试,事情的经过是这样的:
面试官问小张:你了解单例模式吗?
小张谦虚的说:当然,单例模式就是就是这个类我们只能创建一个对象,通常我们最好的办法是让类自身负责保存它唯一的一个实例,然后这个类可以保证没有其他实例可以被创建,并且它可以提供一个唯一的方法访问该实例;
面试官:那这个类通常如何设计才能达到这种效果呢
小张:构造方法私有化这就堵死了外界通过new 创建该对象的可能;获取对象的时候可以判断下该对象是否存在,如果存在的话就创建一个实例,否则就返回当前已经存在的实例
面试官:嗯,很不错,那你在你面前的纸上写一写吧
小张心想:哼,又让我手写代码,写就写,这么低级的问题谁不会呢。。。
饱汉式
/**
* 饱汉式
*/
public class SingletonTest01 {
/**
* 类负责保管的对象
*/
private static SingletonTest01 singletonTest01;
/**
* 私有化构造方法,防止外界通过new 创建对象
*/
private SingletonTest01(){
}
/**
* 提供一个获取本实例的对外方法
* @return SingletonTest01
*/
public static SingletonTest01 getSingletonInstance(){
if (null == singletonTest01){
return new SingletonTest01();
}
return singletonTest01;
}
}
小张信心满满的将上面代码提交给面试官,期待着面试官的称赞其敏捷扎实的基本功;不料,面试官眉头一皱,问到:你这个代码在多线程环境不一定是单例的吧
小张低头一看,果然 if语句存在竞态条件
为了避免眼前的尴尬,小张嘿嘿一笑说:还真是,我再改一版
/**
* 饱汉式升级-01
*/
public class SingletonTest02 {
/**
* 类负责保管的对象
*/
private static SingletonTest02 singletonTest02;
/**
* 私有化构造方法,防止外界通过new 创建对象
*/
private SingletonTest02(){
}
/**
* 提供一个获取本实例的对外方法
* @return SingletonTest02
*/
public static