Java中如何避免死锁并实现线程安全的单例?
时间: 2024-09-10 12:03:27 浏览: 53
在Java中,死锁通常发生在多个线程相互等待对方释放资源的情况下,导致它们都无法继续执行。为了避免死锁,可以遵循一些策略,如避免嵌套锁、设定固定的锁获取顺序等。至于实现线程安全的单例模式,常见的有懒汉式和饿汉式两种:
1. **懒汉式**(延迟加载):
- 使用`volatile`关键字保证可见性和避免双重检查锁定(dcl)问题。
```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;
}
}
```
- 这里通过双重检查锁定确保了线程安全,只有在真正需要实例时才创建。
2. **饿汉式**(预加载):
- 在类加载阶段就创建了实例。
```java
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
- 饿汉式在所有情况下都先初始化,适合对性能要求高且单例实例在应用启动时就会被频繁使用的场景。
阅读全文