这里是一个懒汉式的示例代码:
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对象。
本文通过一个懒汉式的单例模式示例代码,详细解释了在多线程环境下可能产生的问题。当两个线程几乎同时判断实例为空并尝试创建实例时,会导致单例模式失效,创建出多个实例。
2408

被折叠的 条评论
为什么被折叠?



