单间模式:
确保一个类只有一个实例,并提供一个全局访问点。
如果需要一个类只能创建一个对象,可以使用单件模式。
经典的单件模式实现:
public class Singleton{
//利用一个私有静态变量记录该类的唯一实例
private static Singleton uniqueInstance;
... //其他变量
//构造器定义为私有,只有自Singleton类内部才能调用
private Singleton(){}
//利用一个静态方法实例化该类的唯一对象并返回这个对象
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
... //其他方法
}
这段代码在多线程时可能会出问题。
解决方法1:利用同步监视器将getInstance()方法变成同步方法。
public static syschronized Singleton getInstance(){
//...
}
解决方法2:使用急切创建实例而不是延迟实例化的做法。
public class Singleton{
private static Singleton uniqueInstance = new Singleton();;
private Singleton(){}//构造器定义为私有
public static Singleton getInstance(){
return uniqueInstance;
}
}
解决方法3:延迟实现又线程安全的做法:
public class Singleton{
private volatile static Singleton uniqueInstance; //使用voltile关键字修饰
private Singleton(){}//构造器定义为私有
public static Singleton getInstance(){
if(uniqueInstance==null){ //检查实例,如果不存在则进入同步块
synchronized (Singleton.class){ //同步监视器是Singleton的class
if(uniqueInstance==null){ //进入同步块后再次检查
uniqueInstance = new Singleton(); //创建单例对象
}
}
}
return uniqueInstance;
}
}
要点: