1、先上代码:
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2、分析:
第一次校验(instance == null):单例模式只需要创建一个实例,假如实例不为空则不需要去竞争锁,提高性能;
第二次校验(instance == null):synchronized锁住的是Singleton类,在多线程中竞争锁的时候,其中A成功抢夺到资源,创建实例之后释放资源,则当B获得锁之后,校验instance不为空,则直接去获得已被创建的实例。
添加volatile关键字:被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象