模式定义
单例模式 确保类只有一个实例,并提供一个全局访问点。
问题场景
对于很多对象我们应当只能有一个,比如打印机、注册表等,如果有多个实例就会造成资源使用过量或者不一致。
代码
初级版
public class Singleton{
//私有的静态变量记录唯一实例
private static Singleton singletonInstance;
//构造器声明为私有
private Singleton(){};
//静态方法获得唯一实例
//延迟(lazy)实例化
public static Singleton getInstance(){
if(singletonInstance == null){
singletonInstance = new Singleton;
}
return singletonInstance
}
}
初级版缺陷
多线程下出错
进阶版
饿汉——急切(eagerly)实例化
public class Singleton{
//声明时直接实例化,以后获取时直接返回该实例
private static Singleton singletonInstance = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return singletonInstance
}
}
双重检查加锁
防止多线程出错
public class Singleton{
//私有的静态变量记录唯一实例
private volatile static Singleton singletonInstance;
//私有的构造器
private Singleton(){};
//双重检查加锁
public static Singleton getInstance(){
if(singletonInstance == null){
synchronic(this.class){
if(singletonInstance == null){
singletonInstance = new Singleton;
}
}
}
return singletonInstance
}
}
synchronize
保证代码原子性