请写单例模式(饿汉式, 懒汉式), 请再写出线程安全的单例模式
时间: 2024-05-01 15:24:04 浏览: 107
饿汉式单例模式:
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
懒汉式单例模式:
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
线程安全单例模式:
```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;
}
}
```
在多线程环境下,如果不加 synchronized 关键字,则可能会出现多个实例的情况。为了避免这种情况,需要加上 synchronized 关键字。但是这样会导致性能下降,因为每次获取实例时都需要加锁,即使实例已经创建了。为了避免这种情况,可以使用双重检查锁定机制,即在 synchronized 关键字内部再进行一次 if 判断,这样就可以避免每次都加锁的情况。同时需要注意的是,为了避免指令重排带来的问题,需要在 instance 变量前加上 volatile 关键字。
阅读全文