singleton:单例示例
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
在编程领域,"Singleton"是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这个模式在Java中尤其常见,因为Java是一门多线程的语言,有时我们需要确保某个对象在整个应用程序中只存在一个,以防止资源浪费或状态冲突。下面我们将详细探讨Singleton模式的原理、实现方式以及其在Java中的应用。 Singleton模式的核心思想是限制类的实例化,只允许创建一个唯一的实例。这种模式通常用于那些需要频繁实例化然后销毁的对象,或者需要共享资源的情况,例如日志服务、数据库连接池等。 在Java中,实现Singleton有几种常见的方法: 1. **饿汉式(Eager Initialization)**: 这是最简单的实现方式,直接在类加载时就创建了Singleton的实例。 ```java public class Singleton { private static 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 synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 使用`synchronized`关键字保证线程安全,但会降低性能,因为每次调用都需要同步。 3. **双检锁/双重检查锁定(Double-Check Locking)**: 在`getInstance()`方法中添加双重检查,减少不必要的同步,提高性能。 ```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; } } ``` `volatile`关键字确保了多线程环境下的可见性和有序性,提高了效率。 4. **静态内部类**: 静态内部类不会在Singleton类加载时加载,只有当调用`getInstance()`时才会加载,既实现了延迟初始化,又避免了同步问题。 ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 这种方式是推荐的实现方式,既保证了线程安全,又避免了同步带来的性能影响。 5. **枚举**: 将Singleton实现为枚举类型是最简洁、最安全的方式,同时也避免了序列化导致的多实例问题。 ```java public enum Singleton { INSTANCE; } ``` 枚举方式的Singleton在Java中被广泛接受,因为它不仅简洁,而且自动解决了线程安全和反序列化问题。 在实际项目中,选择哪种Singleton实现取决于具体需求。例如,如果内存空间不是问题,对性能要求较高,可以选择双检锁;如果内存优化是关键,静态内部类可能是更好的选择。同时,要注意Singleton模式虽然方便,但也可能导致代码难以测试和维护,因此应谨慎使用。在设计系统时,考虑使用依赖注入框架,如Spring,可以更好地管理对象的生命周期,减少对Singleton的依赖。
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
- 1
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/31e27511b1c54f11a789b74474eed62a_weixin_42134051.jpg!1)
- 粉丝: 19
- 资源: 4599
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 使用JDK中JavaSound音频API接口实现Java程序播放wav音频 包括例程和wav音频示例文件
- C语言实现的约瑟夫环.docx
- PID算法宏定义运算.c
- 统计执法证考试.xmind
- 一种开关电源PID增量式算法.c
- 一种开关电源PID位置式算法.c
- 宏基笔记本主板Acer Chromebook C730 Quanta ZHQ v1.0维修图纸
- 宏基笔记本主板Acer Aspire E5-471G, V3-472P-Quanta ZQ0 r3A维修图纸
- 宏基笔记本主板Aspire A515-54 DA0ZAWMB8C0 Quanta ZAW schematic维修图纸
- 管理系统源码的案例说明.txt管理系统源码的案例说明.txt
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)