写一个线程安全的懒汉式单例模式
时间: 2024-03-02 21:49:30 浏览: 75
好的,以下是一个使用双重检查锁定方式实现的线程安全的懒汉式单例模式的示例代码:
```java
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
// 私有化构造方法,防止外部实例化对象
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在该例子中,我们使用 `private static volatile` 关键字定义了一个静态的 `instance` 对象,`volatile` 关键字可以保证多线程之间的可见性。在 `getInstance()` 方法中,我们通过 `if (instance == null)` 判断该对象是否为 `null`,如果为 `null` 则进入同步代码块,在同步代码块中再次判断 `instance` 是否为 `null`,如果为 `null` 则创建一个新的实例对象并赋值给 `instance`,然后返回该实例对象。由于使用了双重检查锁定方式,因此可以保证在多线程环境下只会创建一个实例对象。
还有一种实现方式是使用静态内部类,以下是使用静态内部类实现的线程安全的懒汉式单例模式的示例代码:
```java
public class Singleton {
private Singleton() {
// 私有化构造方法,防止外部实例化对象
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
在该例子中,我们使用静态内部类 `SingletonHolder` 来创建实例对象,由于静态内部类只有在被引用时才会被加载,因此可以保证在多线程环境下只会创建一个实例对象。在 `getInstance()` 方法中,我们直接返回 `SingletonHolder.INSTANCE` 即可获取实例对象。
阅读全文