public class SingleInstance {
//此处使用vlatile关键字修饰 instance,确保instance对于每个线程都可见,
//即每个线程都能拿到最新的instance的值。
private volatile static SingleInstance instance;
private SingleInstance(){}
public static SingleInstance getInstance(){
if(null == instance){
//使用全局类锁,保证同步
synchronized (SingleInstance.class) {
//避免重复创建对象提高效率
if(null == instance){
instance = new SingleInstance();
}
}
}
return instance;
}
}
JVM编译的过程中会出现指令重排的优化过程,这就会导致当 instance实际上还没初始化,就可能被分配了内存空间,也就是说会出现 instance !=null 但是又没初始化的情况,这样就会导致返回的 instance 不完整
第二种使用内部类
public class SingletonInner {
/**
* 内部类实现单例模式
* 延迟加载,减少内存开销
*
* 类级内部类相当于其外部类的static成员,它的对象与外部类对象间不存在依赖关系,
* 相互独立,因此可直接创建。而对象级内部类的实例,是必须绑定在外部对象实例上的。
* 类级内部类只有在第一次被使用的时候才被会装载
*
* @author xuzhaohu
*
*/
private static class SingletonHolder {
private static SingletonInner instance = new SingletonInner();
}
/**
* 私有的构造函数
*/
private SingletonInner() {
}
public static SingletonInner getInstance() {
return SingletonHolder.instance;
}
protected void method() {
System.out.println("SingletonInner");
}
}