饿汉式
饿汉式多线程和单线程的代码是一样的,如下:
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
懒汉式
为什么 synchronized 内部还要再进行一次 非空 判断呢?
因为假如有一个线程A在进入第一个非空判断后,此时线程A的CPU的执行权交出去给另一个线程B,也就是线程A在这里停止了。假如此时的线程B继续往下执行,并且已经执行了 s = new Single(); 然后线程B执行完了并将执行权交给线程A,注意,此时的 s 已经 new 了,按理说是不需要再 new 了,但是当线程A继续往下执行时,执行了 s = new Single(); 但是这不是我们想要的。
所以这就是我们在 synchronized 内部添加一个 非空判断的原因
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
//--->线程A在这里停住了
synchronized(Single.class)
{
if(s==null)//必须的
//--->线程B已经执行完了;
s = new Single();
}
}
return s;
}
}