java设计模式之单例模式
需积分: 0 106 浏览量
更新于2018-12-30
收藏 6KB RAR 举报
Java设计模式中的单例模式是一种常用的创建型设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置信息等。接下来,我们将深入探讨8种不同的单例实现方式。
1. **饿汉式单例(Eager Initialization)**
这是最简单的单例实现,类加载时就完成了初始化。由于在类加载时就已完成实例化,所以线程安全,但可能会造成内存浪费。
```java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return INSTANCE; }
}
```
2. **懒汉式单例(Lazy Initialization)**
类加载时不初始化,首次调用`getInstance()`时才实例化。线程不安全,多个线程可能同时创建单例对象。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
3. **双重检查锁定(Double-Check Locking)**
懒汉式的一种改进,通过加锁确保线程安全,但只有在`instance`为`null`时才进行实例化。
```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;
}
}
```
4. **静态内部类单例(Static Inner Class)**
静态内部类保证了类的延迟加载,同时利用类装载机制保证线程安全。
```java
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
```
5. **枚举单例(Enum Singleton)**
Java枚举天然支持单例,线程安全且防止反射攻击。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {}
}
```
6. **登记式单例(Registry-Based Singleton)**
使用注册表或Map来存储单例对象,这种方式在某些框架如Spring中常见。
```java
public class SingletonRegistry {
private static Map<String, Object> registry = new HashMap<>();
public static <T> T getSingleton(String key, Supplier<T> supplier) {
return registry.computeIfAbsent(key, supplier);
}
}
public class MySingleton {
public static MySingleton getInstance() {
return SingletonRegistry.<MySingleton>getSingleton("mySingleton", MySingleton::new);
}
}
```
7. **构造器私有化单例(Private Constructor Singleton)**
构造器私有化,外部无法通过`new`关键字实例化,只能通过指定的工厂方法获取单例。
```java
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
8. **线程局部变量单例(ThreadLocal Singleton)**
使用`ThreadLocal`为每个线程提供一个独立的单例实例,适用于多线程环境下的隔离需求。
```java
public class ThreadLocalSingleton {
private static ThreadLocal<Singleton> instance = new ThreadLocal<>();
private ThreadLocalSingleton() {}
public static Singleton getInstance() {
Singleton localInstance = instance.get();
if (localInstance == null) {
instance.set(new Singleton());
localInstance = instance.get();
}
return localInstance;
}
}
```
以上就是8种常见的Java单例模式实现方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择合适的设计模式。在实际开发中,理解并熟练运用这些模式,有助于提高代码质量,降低维护成本。
Starry-
- 粉丝: 623
- 资源: 14
最新资源
- 基于ssh员工管理系统
- 5G SRM815模组原理框图.jpg
- T型3电平逆变器,lcl滤波器滤波器参数计算,半导体损耗计算,逆变电感参数设计损耗计算 mathcad格式输出,方便修改 同时支持plecs损耗仿真,基于plecs的闭环仿真,电压外环,电流内环
- 毒舌(解锁版).apk
- 显示HEX、S19、Bin、VBF等其他汽车制造商特定的文件格式
- 操作系统实验 Ucore lab5
- 8bit逐次逼近型SAR ADC电路设计成品 入门时期的第三款sarADC,适合新手学习等 包括电路文件和详细设计文档 smic0.18工艺,单端结构,3.3V供电 整体采样率500k,可实现基
- 操作系统实验 ucorelab4内核线程管理
- 脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果 bldc控制器方案,无刷电机 提供源码,原理图
- Matlab Simulink#直驱永磁风电机组并网仿真模型 基于永磁直驱式风机并网仿真模型 采用背靠背双PWM变流器,先整流,再逆变 不仅实现电机侧的有功、无功功率的解耦控制和转速调节,而且能实