写一个线程安全的单例模式
时间: 2023-06-05 07:04:15 浏览: 58
好的,关于线程安全的单例模式,我可以为您提供以下两种方式:
方式一:使用静态内部类实现单例
```java
public class Singleton {
private Singleton() {} // 构造函数私有化
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
该实现方式使用了静态内部类,利用了 Java 类加载机制来保证线程安全和懒加载,并且实现代码较为简洁。
方式二:使用双重检验锁实现单例
```java
public class Singleton {
private volatile static Singleton instance; // volatile 保证内存可见性和禁止指令重排
private Singleton() {} // 构造函数私有化
public static Singleton getInstance() {
if (instance == null) { // 第一次判断,提高性能
synchronized (Singleton.class) {
if (instance == null) { // 第二次判断,防止多线程下重复创建
instance = new Singleton();
}
}
}
return instance;
}
}
```
该实现方式利用了双重检验锁和 volatile 关键字来保证线程安全和懒加载,但需要注意 volatile 关键字的使用。
以上两种实现方式都能够保证线程安全和懒加载,具体选择哪一种实现方式,需要根据具体的业务场景和性能需求来进行权衡和选择。