实现一个线程安全的单例
时间: 2023-08-08 12:10:03 浏览: 40
下面是一个线程安全的单例实现,使用了双重检查锁定和 volatile 关键字来保证线程安全:
```java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
// 私有化构造函数
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在上述代码中,`instance` 使用了 `volatile` 关键字来保证多线程环境下的可见性,避免出现线程 A 修改了 `instance`,但线程 B 却看不到的情况。双重检查锁定可以避免每次获取实例时都需要进行同步,提高了效率。在 `getInstance()` 方法中,第一次检查 `instance` 是否为空,如果为空则进入同步块,再次检查 `instance` 是否为空。如果为空,则创建一个新的 `Singleton` 对象,并将其赋值给 `instance`。这样可以保证只有第一次调用 `getInstance()` 方法时才会进行同步,提高了效率。
需要注意的是,使用双重检查锁定实现单例需要在 Java 1.5 或以上版本中使用 `volatile` 关键字才能保证线程安全。