一、单例模式的陷阱
设计模式中的单例模式应该是被大家使用最广泛的模式之一,但网上关于单例模式的诟病也不少,最集中的就是:在多线程的环境下,单例模式有可能返回不止一个的对象。那么到底为什么会出现这种情况呢?下面我们来看单例模式的两种实现方式
方式一
public class Singleton {
//注意构造方法必须是私有的
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
方式二
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例!
if (instance==null)
instance=new Singleton();
return instance;
}
}
}
二、单例模式在多线程下的安全实现
《Java并发编程》一书建议使用属于当前类的锁进行同步,代码如下:
public class Singleton {
private static Singleton instance = null;
// 注意这里的static非常重要,如果为对象变量则因为存在多份拷贝而起不到限制的作用
private static Object classLock = Singleton.class;
public static Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例!
synchronized(classLock){
if (instance==null)
instance=new Singleton();
return instance;
}
}
}
}
三、使用单例模式的另外一些注意点
·单例模式类不能实现Clonable接口,以防被克隆而产生多个实例
·单例模式类不能实现Serializable接口,以防被序列化而产生多个实例
四、单例模式的使用范围
·一个系统中有且只有一个实例。