有时候我们需要对外呈现只有一个对象,简单来说就是讲对象私有化,像数据那样,只能通过get方法得到。这里使用doublechecking来进行该操作,即在get方法里面加入两个判断该对象是否为空,同时为了避免指令重排导致线程获得空对象,加入volatile,而且私有化构造器。
public class DoubleChecking {
private volatile static DoubleChecking instance;
private DoubleChecking(){
}
private synchronized static DoubleChecking getDoubleChecking(){
//doublechecking双重检测
if(instance!=null){
return instance;
}
if(instance==null){
instance =new DoubleChecking();
//创建空间返回对象的地址,这里由于可能会出现指令重排所以使用volatile,避免线程取到空的对象地址
}
return instance;
}
public static void main(String[] args) {
Thread t=new Thread(()->{
System.out.println(getDoubleChecking());
});
t.start();
System.out.println(getDoubleChecking());
}