这里是一个懒汉式的示例代码:
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对象。