应用场景
多线程创建单例,避免并发重复创建对象。
代码引入
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton _obj; // 标识1
private DoubleCheckSingleton(){}
public DoubleCheckSingleton getInstance()
{
if(_obj==null) //标识2
{
synchronized (DoubleCheckSingleton.class)//标识四
{
if(_obj==null ) //标识3
{
_obj = new DoubleCheckSingleton();
}
}
}
return _obj;
}
}
解释
标识1:使用了volatile定义对象,主要是为了多线程可见。
标识2:第一次检查
标识3:锁住当前类对象,避免多线程并发干扰。
标识4:第二次检查。(锁的过程需要时间,有可能在锁的时候同时创建了)。