手写一个单例模式
时间: 2023-07-07 16:22:14 浏览: 46
好的,下面是一个基于懒汉式的线程安全的单例模式示例:
```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;
}
}
```
解释一下这个实现方式:
1. 构造函数是私有的,确保外部不能通过 `new` 关键字来创建实例。
2. `getInstance()` 方法是静态的,确保可以通过类名直接调用。
3. `instance` 变量是 `volatile` 的,确保多线程下的可见性。
4. 懒汉式的实现方式,只有在第一次调用 `getInstance()` 方法时才会创建实例。
5. 线程安全的实现方式,使用双重检查锁定(double-checked locking)来避免多线程下的竞态条件。在 synchronized 块内部再次检查 instance 是否为 null,以确保只有一个线程会创建实例。
注意,虽然这个实现方式是线程安全的,但是双重检查锁定会带来一些性能开销,因此如果不需要懒加载的话,可以直接使用饿汉式的单例模式实现。