知识卡片

懒汉式单例的线程安全隐患与clone陷阱

普通读书笔记卡 · 1984.d

内容

[[单例模式的定义与实现要点]]分两种:饿汉式类加载时创建,天然线程安全;懒汉式首次调用才 判断创建,若不加同步,高并发下两线程都通过null判断会各自创建实例,破坏唯一性。解法是加 synchronized,或直接用饿汉式。另外单例类不应实现Cloneable,否则clone会绕过私有构造 函数破坏唯一性约束。发散:”先检查再执行”分两步的逻辑并发下都存在竞态窗口,是常见缺陷。

参考来源

- 位置:《设计模式之禅(第2版)》第7章《单例模式》(源文件:_epub-src/text/part0030.html) - 结论依据:原文用双线程时序图式的文字描述解释懒汉式单例"检查null再创建"存在的竞态条件,并说明对象复制可以绕过私有构造函数、因此单例类不应实现Cloneable接口。 - 原始内容:一个线程A执行到singleton = new Singleton(),但还没有获得对象……第二个线程B也在执行,执行到(singleton == null)判断,那么线程B获得判断条件也是为真……在内存中就出现两个对象!……解决该问题的最好方法就是单例类不要实现Cloneable接口。