请解释单例模式中的双重检查锁定(double-checked locking)实现,并说明其线程安全问题。
考察说明
考察并发单例实现的理解、原子性与可见性、以及现代Java下的正确写法
回答思路
- 解释双重检查锁定的基本流程:先判空、加锁、再判空、创建实例
- 指出旧写法在Java早期版本中的可见性问题,并解释volatile的作用
- 能说明现代Java(如JVM内存模型修订后)及持有者类等其他线程安全单例方案
- 能分析为何有时仍需考虑instance非空但未完全初始化的竞态
考察并发单例实现的理解、原子性与可见性、以及现代Java下的正确写法