在Java中,如何正确地创建一个线程安全的单例模式(Singleton),并简要说明“Double-CheckedLocking”在JDK5之后为何能生效?_[MMKMMC]
可以使用“Double-CheckedLocking”结合`volatile`关键字实现线程安全的懒汉式单例,例如:
```java
publicclassSingleton{
privatestaticvolatileSingletoninstance;
privateSingleton(){}
publicstaticSingletongetInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=newSingleton();
}
}
}
returninstance;
}
}
```
在JDK5之后,`volatile`保证了`instance`的写操作对其他线程立即可见,并禁止指令重排序(防止`newSingleton()`中的分配内存、初始化、赋值三个步骤被重排),从而避免了早期JDK中因重排序导致的“半初始化对象”被其他线程读取的问题。