Java单例模式详解与实现
下载需积分: 7 | TXT格式 | 11KB |
更新于2024-09-16
| 94 浏览量 | 举报
"这篇文章主要介绍了Java中的单例模式(Singleton),包括其概念、作用以及一个简单的单例模式实现示例。"
单例模式是软件设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁创建和销毁,但又需要共享状态的对象,例如配置管理、日志服务、数据库连接池等。
在Java中,单例模式通常通过以下几种方式实现:
1. 饿汉式(Eager Initialization):在类加载时就完成初始化,保证了线程安全,但可能会造成资源浪费。示例代码中给出的便是饿汉式的实现:
```java
class OnlineCounter {
private int onlineCount = 0;
private OnlineCounter() {
this.onlineCount = 100;
}
public static OnlineCounter getInstance() {
return new OnlineCounter();
}
// 其他方法省略
}
```
在这个例子中,`OnlineCounter`类在被加载时就会创建一个实例,`getInstance()`方法返回这个唯一的实例。
2. 懒汉式(Lazy Initialization):延迟到第一次请求时才进行初始化,提高了资源利用率,但可能不线程安全。未显示的懒汉式代码可能如下:
```java
class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
这里的同步关键字`synchronized`保证了多线程环境下的安全性,但会引入性能开销。
3. 双重检查锁定(Double-Checked Locking):结合了饿汉式的效率和懒汉式的资源利用率,保证了线程安全,同时也延迟了初始化。改进后的懒汉式代码如下:
```java
class Singleton {
private volatile static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
`volatile`关键字保证了`instance`变量的可见性和有序性,避免了线程间的缓存不一致问题。
4. 静态内部类(Static Inner Class):利用类加载机制保证线程安全,同时延迟初始化。
```java
class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
这里`SingletonHolder`类只有在调用`getInstance()`时才会被加载,因此实例化发生在首次调用时。
5. 枚举(Enum):简单且线程安全,是实现单例的推荐方式。
```java
enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
```
枚举在Java中天然具有单例属性,且不允许子类化,是Java中实现单例的最安全方式。
单例模式在控制对象的创建和生命周期、保证全局唯一性等方面有重要作用,但过度使用可能导致设计过于复杂,不易测试。在实际开发中应根据需求选择合适的实现方式。
相关推荐
![filetype](https://img-home.csdnimg.cn/images/20241231045021.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044955.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045021.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![filetype](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
zhang06101019
- 粉丝: 0
最新资源
- 辛辛那提大学RALL3080巧克力能量研究与React应用开发指南
- Libcurl-7.40.0版:含zlib和openssl功能的库文件
- Gale-Shapley算法实例演示与物流部门优化应用
- 掌握FP-Growth算法:原理、创建过程及案例演示
- 自定义体验:AoeReader txt阅读器深度个性化设置
- Mega-Sena游戏号恢复与结果查看插件
- FPGA驱动VGA开发俄罗斯方块游戏教程
- C语言编程经典例子与俄罗斯方块源代码解析
- 如何提升Windows XP最大TCP并发连接数至150
- 华为开发者面试学习项目:LeetCode与Nowcoder代码集
- Fiddler证书安装指南:轻松访问HTTPS网站
- Anssxustawai: ShareX高效上载服务器实现与特性解析
- Notepad++手动安装XML格式化插件教程
- Clean Blog:适用于个人与公司的响应式Wordpress主题
- GfxListCtrl:扩展功能强大的ListCtrl控件
- Android TabLayout选项卡实践与实现教程