class Single{
private static final s = null;
private Single(){}
public static void getInstance(){
if(s==null) //这里要多加一次判断,这里的判断目的判断进来的线程是否为空
synchronized(Slingle.class)
if(s==null)//这里判断的时候,如果有多条线程,一线程进来出去之后其他的的线程如果想进来得先判断锁
{
A------>
s = new Single();
}
return s;
}
}
这样双重判断,首先如果一个线程A进来了,判断为空,那么进来判断也满足条件 A线程如图 ,,这时又进来一个B线程进来,判断s==null,所以 进来,因为有锁,进不去,然后线程A new了一个对象然后出去了,这时线程B 进去了,再次判断s==null,不满足条件,因此进不去。此时如果在来一个C线程先判断第一个s==null,就不满足条件,所以不用判断锁。减少了判断锁的次数,提高了懒汉式的效率。 |