4,多线程场景下以前的单例模式会不会出问题(出现多个实例),会则演示出结果不会则改写出线程安全的单例模式。
时间: 2024-09-08 16:02:11 浏览: 36
Asp.Net设计模式之单例模式详解
在多线程环境下,传统的单例模式如果不加额外的同步措施,确实可能会出现问题,即可能出现多个实例(即多例问题)。这是因为在没有控制线程访问顺序的情况下,如果多个线程同时尝试创建实例,就可能导致每个线程都创建一个新的对象。
例如,下面是一个非线程安全的简单单例模式示例:
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
在这个例子中,如果有两个线程几乎同时访问`getInstance()`,它们都可能会发现`instance`为null,并各自创建新的实例,导致多例现象。
为了避免这个问题,可以使用双重检查锁定(Double-checked locking)或者枚举类型的方式来实现线程安全的单例模式。以下是使用双重检查锁定的例子:
```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;
}
}
```
这里添加了`synchronized`关键字,保证了在多线程环境下的线程安全性。当需要实例时,先判断是否已经存在,不存在才加锁并创建。
阅读全文