因为s是共享数据,当多个线程并发访问getInstance()方法时,就会有多条线程同时在操作共享数据s,这种情况是有可能发生的。比如:现在有两个线程A,B。线程A调用getInstace()方法,这时线程A已经进入getInstace()方法内,读 if(s == null)语句,突然之间就挂起了(这时有可能的哦)。然后线程B获得了执行权,调用getInstace()方法,这时线程B也进入getInstace()方法内,读 if(s == null)语句,执行s = new Single();于是就在堆内存中创建了对象S。当线程A醒来后,也执行s = new Single();于是就又创建了一个S!!!以此类推,当很多个线程同时操作s时,有可能会new出很多个对象,这就是懒汉式的不安全性。
修改后的代码:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s == null)
{Synchronized(Single.class)
{ if(s == null)
s = new Single();
}
}
return s;
}
} |