首先,你这个代码不是懒汉式
下面就说说打印的情况
public void run()
{
if(s==null)
{//t1 t2----->如果两个线程都同时执行到这里的时候失去了执行权,等再次拿到执行权的没有回去判断S==null的条件,执行完同步代码块的代码就会再建两个对象,也就是打印三次"new Single()" 情况2:如果挂在这的线程只是t1或者t2中的其中一个 等拿回执行权的时候就会建立一个S对象 然后另外一个线程再一判断条件s!=null也就不会进这代码里面 这时候就是打印两次
synchronized(Single.class)
{//当然对应打印三次的情况一个挂在上面的位置其中一个线程挂在这里也是可能的 这没什么太大的区别
//if(s==null)
s=new Single();
}
}
}
public class LazyMode {
public static void main(String[] args) {
Single t=new Single();//这是一定会打印的第一次"new Single()"
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
}
|