单例模式讲解案例
需积分: 0 155 浏览量
更新于2019-01-17
收藏 11KB ZIP 举报
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。这种模式常被用于管理共享资源,如数据库连接、线程池或者配置文件等,以减少系统资源的浪费并提高效率。
在Java、C#、Python等面向对象编程语言中,实现单例模式有多种方法。以下是一些常见的实现方式:
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;
static {
INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
3. 懒汉式(线程不安全):延迟初始化,只有在第一次调用getInstance()时才创建实例。但是这种方式在多线程环境下会出现多个实例。
```java
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static 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类加载机制保证线程安全,同时延迟初始化。
```java
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
```
6. 枚举型单例:JDK 1.5以后,推荐使用枚举实现单例,既简单又安全,还能防止反序列化重新创建新的实例。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {
//...
}
}
```
7. 非阻塞单例(基于AtomicReference):使用AtomicReference保证线程安全,同时保持高性能。
```java
import java.util.concurrent.atomic.AtomicReference;
public class Singleton {
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<>();
private Singleton() {}
public static Singleton getInstance() {
while (true) {
Singleton current = INSTANCE.get();
if (current != null) {
return current;
}
Singleton newInstance = new Singleton();
if (INSTANCE.compareAndSet(null, newInstance)) {
return newInstance;
}
}
}
}
```
以上就是单例模式的一些常见实现方式,每种方式都有其优缺点,需要根据具体的应用场景选择合适的方法。理解并熟练运用单例模式,对于优化程序结构、提高代码复用性以及资源管理等方面都有积极的意义。在实际开发中,合理使用单例模式可以有效提升软件的质量和性能。
小小华bk
- 粉丝: 81
- 资源: 36
最新资源
- 从零学习自动驾驶Lattice规划算法(下) 轨迹采样 轨迹评估 碰撞检测 包含matlab代码实现和cpp代码实现,方便对照学习 cpp代码用vs2019编译 依赖qt5.15做可视化 更新:
- 风光储、风光储并网直流微电网simulink仿真模型 系统由光伏发电系统、风力发电系统、混合储能系统(可单独储能系统)、逆变器VSR+大电网构成 光伏系统采用扰动观察法实现mppt控
- (180014016)pycairo-1.18.2-cp35-cp35m-win32.whl.rar
- (180014046)pycairo-1.21.0-cp311-cp311-win32.whl.rar
- DS-7808-HS-HF / DS-7808-HW-E1
- (180014004)pycairo-1.20.0-cp36-cp36m-win32.whl.rar
- (178330212)基于Springboot+VUE的校园图书管理系统
- (402216)人脸识别
- enspOSPF多区域路由配置
- (175822648)java项目之电信计费系统完整代码.zip