Java单例模式详解与实现
需积分: 7 32 浏览量
更新于2024-09-16
收藏 11KB TXT 举报
"这篇文章主要介绍了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中实现单例的最安全方式。
单例模式在控制对象的创建和生命周期、保证全局唯一性等方面有重要作用,但过度使用可能导致设计过于复杂,不易测试。在实际开发中应根据需求选择合适的实现方式。
190 浏览量
点击了解资源详情
点击了解资源详情
190 浏览量
2016-02-15 上传
2015-03-23 上传
2021-07-16 上传
2021-07-06 上传
2021-07-16 上传

zhang06101019
- 粉丝: 0
最新资源
- OctoPrint-TPLinkSmartplug插件的固件兼容性问题及解决方案
- Windows API系统托盘实例详解与交流指南
- Oracle EBS TRM技术参考手册解析
- 探索纯HTML5拓扑图编辑器源代码的无限可能
- ARKit实现裸手指空中绘画:Swift开发实战
- org.json JSONObject依赖的jar包及其版本号
- Bandicam 1.8.7.347:游戏录屏新选择,体积小音质佳
- MATLAB图像处理技术实现螺纹识别项目源代码
- 如何有效使用Window Installer Clean Up工具
- 聚合物Web组件简化D2L界面控制方法
- Tyra: 专为SEO优化的女性风格Gatsby启动器
- Windows NT 2000原生API参考手册下载
- 高效UDP日志传输:客户端与服务端代码实现
- 实现Android淡入淡出效果的欢迎界面教程
- uLog:嵌入式系统轻量级日志记录解决方案
- ARM裸奔环境下C库应用与Makefile实现指南