1.单例模式,通过双重校验锁的方式实现.
public class Single{
private volatile static Single ui;
private Single(){}
public static Single getUniqueInstanse(){
//先判断对象是否实例过,如果没有才会实例化这个对象
if(ui == null){
synchronized(Single.class){
if(ui == null){
ui = new Single();
}
}
}
return ui;
}
}
那么这里面的ui采用volatile来修饰是很有必要的,因为在 ui = new Single()的时候,jvm会做如下3件事情:
- 给ui分配内存空间
- 初始化ui
- 将ui指向分配的内存地址
因为jvm是具有指令重排的特性,所以我们如果不加volatile可能面对执行顺序变为1-3-2的情况(在多线程的情况下)