这里是一个懒汉式的示例代码:
public class Singleton {
private static Singleton s;
private Singleton() {
}
public static Singleton getInstance() {
if (s == null) {
//线程在这里等待
s = new Singleton();
}
return s;
}
}
我们假设有多个线程1,线程2都需要使用这个单例对象。而恰巧,线程1在判断完s==null后突然交换了cpu的使用权,变为线程2执行,由于s仍然为null,那么线程2中就会创建这个Singleton的单例对象。之后线程1拿回cpu的使用权,而正好线程1之前暂停的位置就是判断s是否为null之后,创建对象之前。这样线程1又会创建一个新的Singleton对象。