1、线程不安全
/**
* 线程不安全
*/
public class SingleApplicationUnsafe {
private static SingleApplicationUnsafe singleApplication = null;
private SingleApplicationUnsafe(){
}
/**
* 双重检测+锁
* @return
*/
public static SingleApplicationUnsafe getInstance(){
if(singleApplication ==null){
synchronized (SingleApplicationUnsafe.class){
if(singleApplication == null){
singleApplication = new SingleApplicationUnsafe();
}
}
}
return singleApplication;
}
}
2、线程安全
/**
* 双重检测+锁+volatile 线程安全
*/
public class SingleApplicationSafe {
private static volatile SingleApplicationSafe singleApplication = null;
private SingleApplicationSafe(){
}
/**
* 双重检测+锁+volatile
* @return
*/
/**
* singleApplication = new SingleApplicationSafe();这个步骤是三步
* 1、第一步 分配内存空间
* 2、第二步 初始化singleApplication
* 3、第三步 singleApplication 指向内存空间
* jvm和cpu会进行优化,造成指令重排,所以第二步和第三步有可能发生颠倒,所以可能造成返回的实例没有具体的信息
*
* 解决办法就是:利用volatile,这个关键字可以禁止指令重排
* @return
*/
public static SingleApplicationSafe getInstance(){
if(singleApplication ==null){
synchronized (SingleApplicationSafe.class){
if(singleApplication == null){
singleApplication = new SingleApplicationSafe();
}
}
}
return singleApplication;
}
}