java + 单例模式 + 懒汉式 + 资源
本文档比较清晰明了地介绍了懒汉式以及懒汉式(我要对象的时候才给我创建)和饿汉式(我不要对象的时候你也给我创建)的区别;懒汉式只有你调用返回对象的方法时才调用对象,饿汉式是在类加载的时候就创建了对象;懒汉式存在线程安全的问题,而饿汉式存在资源空间浪费的问题;二者调用一次对象后,无论后面调用多少次对象,它都会返回第一个创建的对象,保证单例的实现。 Java 单例模式是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式有多种实现方式,其中最常用的两种是饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)。本文将深入探讨懒汉式单例模式,以及它与饿汉式的区别。 ### 懒汉式单例模式 懒汉式的核心思想是“延迟初始化”,即在对象真正被需要时才进行创建。这样可以避免在类加载时就占用不必要的资源,只有当调用获取对象的方法时,才会去创建单例对象。以下是懒汉式的实现步骤: 1. **构造器私有化**:这是所有单例模式的基础,通过将构造器设为私有,防止外部直接通过new关键字创建实例。 2. **在类的内部创建静态对象**:这个静态对象是单例类的唯一实例,通常为private修饰,以防止外部访问。 3. **提供一个public的static方法**:该方法负责返回单例对象,通常是通过检查实例是否已经创建,如果未创建,则进行实例化,然后返回。 懒汉式的具体实现代码如下(考虑线程安全): ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 这段代码使用了双重检查锁定(Double-Checked Locking),确保在多线程环境下也能正确创建单例,同时减少了同步开销。 ### 饿汉式单例模式 与懒汉式不同,饿汉式在类加载时就创建了单例对象,即使这个对象可能从未被使用。这种方式确保了线程安全,但可能会浪费内存资源。饿汉式的实现相对简单: ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` ### 饿汉式与懒汉式的区别 1. **初始化时机**:饿汉式在类加载时初始化,懒汉式在首次调用getInstance()时初始化。 2. **线程安全性**:饿汉式天生线程安全,懒汉式如果不采用同步控制则不是线程安全的。 3. **资源消耗**:饿汉式可能造成资源浪费,因为不管是否使用,对象都会在类加载时创建。懒汉式只有在需要时才创建对象,节省了资源。 4. **性能**:饿汉式性能较好,因为初始化时就完成了,而懒汉式在多线程下需要同步控制,性能相对较差。 ### 相同点 1. **单例特性**:无论是饿汉式还是懒汉式,都确保了类只有一个实例,且提供全局访问点。 2. **实例共享**:多次调用getInstance()返回的是同一个对象实例,保证了对象的唯一性。 选择哪种方式取决于对性能、资源消耗和初始化时机的具体需求。在并发场景下,懒汉式需要额外的线程安全措施,而饿汉式则不需要。在资源有限但对性能要求较高的环境中,饿汉式可能是更好的选择;而在对资源利用率要求高、对象创建代价较大的情况下,懒汉式更有优势。
- 粉丝: 49
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip