上传者: 38692969
|
上传时间: 2026-04-16 23:44:07
|
文件大小: 49KB
|
文件类型: PDF
Java单例模式是一种设计模式,它旨在控制类的实例化过程,确保在整个应用程序中,同一类最多只有一个实例存在。这种模式常被用于管理共享资源,比如数据库连接池、线程池或者配置信息等,因为这些资源往往需要全局唯一且状态需要保持一致。
在Java中,实现单例模式主要有以下几种方式:
1. **饿汉式(静态常量)**:
这种方式在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,线程安全。
```java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
2. **懒汉式(线程不安全)**:
这种方式在类首次被调用时才初始化,但线程不安全。在多线程环境下可能会创建多个实例。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
3. **懒汉式(同步方法)**:
通过synchronized关键字保证了线程安全,但每次获取实例时都需要进行同步,性能较低。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
4. **双检锁/双重校验锁(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;
}
}
```
5. **静态内部类**:
利用类加载机制保证初始化实例时只有一个线程,线程安全,且只在第一次加载时进行初始化,所以效率较高。
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
6. **枚举**:
简洁且线程安全,但不常用,因为枚举主要用于定义常量。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
```
在给定的代码示例中,采用的是懒汉式的实现方式,但是它是线程不安全的。当多个线程同时调用`getInstance()`方法时,有可能创建多个`Emperor`实例。为了修复这个问题,可以将`getInstance()`方法改为同步方法,或者采用其他线程安全的单例实现方式。
此外,这个示例中的`Emperor`类有一个`getName()`方法,用于输出皇帝的名字。在实际应用中,这样的共享资源类可能会包含更复杂的业务逻辑或数据处理方法。
总结来说,Java单例模式通过限制类的实例化,保证了全局唯一性,有效地管理和复用了系统资源,提高了程序的效率。在实现单例模式时,需要注意线程安全问题,并选择适合的实现策略来平衡性能和安全性。