Java单例模式详解:饿汉子、懒汉子与注册式

"Java单例类的实现方式包括饿汉子式、懒汉子式和注册式。饿汉子式在类加载时就创建实例,保证线程安全但不延迟初始化。懒汉子式在第一次调用getInstance()时创建实例,通过synchronized关键字确保线程安全,但可能造成不必要的同步开销。注册式单例结合了两者,允许子类化并以懒初始化方式创建实例,通过一个静态注册表来管理各个实例。"
在Java中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供全局访问点。单例模式在很多场景下非常有用,例如控制资源的共享、创建昂贵的对象或者管理系统级别的服务。
1. **饿汉子式单例** (Eager Initialization):
饿汉子式单例在类加载时就完成了实例化,所以它是线程安全的。这种方式的优点是初始化时就创建了单例,避免了多次实例化的可能性。但是,如果单例类不经常使用,那么这种提前创建可能会浪费资源。
```java
public class HungrySingle {
private static final HungrySingle hungry = new HungrySingle();
private HungrySingle() {}
public static HungrySingle getInstance() { return hungry; }
}
```
2. **懒汉子式单例** (Lazy Initialization):
懒汉子式单例在首次调用`getInstance()`方法时才创建实例,这延迟了初始化,提高了效率。但是,如果不使用synchronized关键字,可能会导致多个线程同时创建单例实例,因此通常会使用`synchronized`修饰`getInstance()`方法来确保线程安全。然而,这种方法每次调用`getInstance()`都需要同步,可能会降低性能。
```java
public class LazySingle {
private static LazySingle lazy = null;
private LazySingle() {}
public synchronized static LazySingle getInstance() {
if (lazy == null) {
lazy = new LazySingle();
}
return lazy;
}
}
```
3. **登记式单例** (Registry Singleton, 又称静态工厂或双检锁/双重校验锁单例):
登记式单例是饿汉子式和懒汉子式的结合,它通过一个静态注册表来保存单例实例,允许子类化并且仍然保持线程安全。这种方式在多线程环境中更高效,因为只有第一次实例化时才需要同步。子类可以通过继承并重写注册方法来实现延迟初始化。
```java
public class RegistrationSingle {
private static HashMap<String, RegistrationSingle> regist = new HashMap<>();
private RegistrationSingle() {}
public static RegistrationSingle getInstance(String key) {
// 实现根据key获取或创建实例的逻辑
}
}
```
选择哪种单例模式取决于具体需求,如是否需要延迟初始化、是否考虑多线程环境、是否允许子类化等。在实际开发中,通常会优先考虑懒汉子式单例,但在性能敏感的情况下,可能会采用登记式单例来平衡性能和线程安全性。
759 浏览量
2114 浏览量
2024-11-07 上传
270 浏览量
101 浏览量
103 浏览量
2012-07-25 上传
2014-10-17 上传
115 浏览量

wang_8630
- 粉丝: 1
最新资源
- Jboss EJB 3.0 实战教程:从入门到精通
- Jboss EJB3.0实战教程:从入门到高级
- Delphi编程:流操作详解与应用实例
- MySQL字符串处理:SET NAMES, ASCII, ORD与CONV函数解析
- 动态代理模式详解:提升权限管理效率
- C#初学者指南:从基础到面向对象编程
- JewelCAD新手指南:全面操作与设置教程
- JCS:Java分布式缓存系统详解与实践配置
- WFMC工作流参考模型:详解内部机制与发展历程
- 《JasperReports终极指南》- Teodor Danciu著
- Apache JCS:高效分布式缓存系统
- 敏捷开发实战技巧与进阶
- 程序员面试必备:笔试环节深度解析
- osg事件控制示例:键盘模型与代码实现
- 46家知名企业笔试题目集锦:提升你的技术实力
- InfoQ中文站:免费在线学习Struts2深度指南