单例模式 单例对象的类只有一个实例存在 避免产生多个对象消耗过多资源
构造方法一般不对外开放 一般为private
通过静态方法或枚举返回单例类对象
确保单例类对象有且只有一个 尤其是多线程的情况下
确保单例类对象在反序列化的时候不会重新构建对象
单例模式的构建
1 懒汉模式
public class A{
private static A instance;
private A() {}
public static synchronized A getInstance(){
if (instance==null){
instance=new A();}
return instance;}
}
通过 给getInstance 方法添加 synchronized 关键字实现线程同步 保证对象唯一 优点是第一次调用时才会被实例化 但问题在于即使 instance已经被实例化 再次调用getInstance也会再次进行同步 增加了开销 (可能是知道最多的单例模式)
2.Double Check Lock DCL
public class A {
private static A instance;
private A() {
}
public static A getInstance() {
if (instance ==null) {
synchronized (A.class) {
if (instance ==null) {
instance =new A();
}
}
}
return instance;
}
}
3.静态内部类单例模式
class A {
private A() {
}
public static A getInstance() {
return AHolder.aInstance;
}
private static class AHolder {
private static final AaInstance =new A();
}
}
4.枚举单例
枚举本身就是单例
上述例子如果需要杜绝单例对象在反序列化时重新生成对象 需要重写
private Object readResolve ()throws ObjectStreamException{
return aInstance;
}