一:相关定义
单件模式:确保一个类只有一个实例,并提供一个全局访问点。
二:相关类图
类图:
挺简单的一个模式,就不多说了,但在多线程情况下要注意使用同步:
public class Singleton{
private volatile static Singleton uniqueInstance;
//其他有用的实例化的变量
//构造器私有
private Signleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized (Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
}
}
这里使用的是双重检查锁定来创建对象,主要是为了避免在进入getInstance()方法时加锁,提高效率;同时这里的引用uniqueInstance需要声明为volatile的,不然可能导致对象在未构造完成之前就被赋值给引用(Jdk1.5增强了volatile语义,禁止了相关的重排序;之前的版本使用这种方式创建时会有问题)
还有一种方式就是使用类似工厂模式,将创建对象的责任交给第三方,然后进行返回;(因为类的初始化锁会使得当前只有一个线程进行类加载初始化,防止了并发的问题)
public class InstanceFactory{
private static class InstanceHolder{
public static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
//这里将导致InstanceHolder类被初始化
return InstanceHolder.instance;
}
}
或者在静态初始化中创建单件,但这就不是延时加载了。其实上面那种就是这个的变种。
private static Singleton uniqueInstance = new Singleton();
//然后在静态方法中返回
......
参考书籍:《head first 设计模式》《java并发编程的艺术》