单例模式 饿汉式和懒汉式的区别

单例模式(Singleton Pattern)是设计模式中最简单、最常见、最容易实现的一种模式。它确保一个类仅有一个实例,并提供一个全局访问点。单例模式主要有两种实现方式:饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)。它们之间的主要区别体现在以下几个方面:

1. 创建对象的时机

  • 饿汉式:在类被加载时就会创建实例对象。这意味着,只要类被JVM加载进内存,单例对象就会被创建。这种方式以空间换时间,即牺牲一部分内存空间来换取更快的访问速度,因为实例已经预先创建好了,不需要再进行判断。
  • 懒汉式:在类被加载时不会创建实例对象,只有在第一次使用该实例时才会创建。这种方式以时间换空间,即牺牲创建实例的时间来换取更少的内存空间占用,因为实例是在需要时才创建的。

2. 线程安全性

  • 饿汉式:由于实例在类加载时就已经创建,因此不存在多线程访问时创建多个实例的问题,所以它是线程安全的。
  • 懒汉式:如果没有采取额外的同步措施,懒汉式在多线程环境下可能会出现多个实例被创建的情况,因此它不是线程安全的。但是,可以通过加锁(如synchronized关键字)或使用静态内部类等方式来确保线程安全。

3. 资源利用

  • 饿汉式:可能存在资源浪费的情况,因为如果程序中从未使用过该实例,那么预先创建的实例就会浪费内存空间。
  • 懒汉式:由于实例是在需要时才创建的,因此可以避免不必要的资源浪费。

4. 使用场景

  • 饿汉式:适用于实例创建过程相对简单,且不会占用过多资源的情况。或者,当系统初始化时就需要该实例,并且之后频繁使用,那么饿汉式可以节省获取实例的时间。
  • 懒汉式:适用于实例创建过程较为复杂,或者资源占用较多,且实例不是频繁使用的情况。通过懒加载,可以延迟实例的创建时间,从而节省系统资源。

综上所述,饿汉式和懒汉式在单例模式的实现中各有优缺点,应根据具体的使用场景和需求来选择合适的实现方式。

相关推荐
孟陬7 小时前
国外技术周刊 #3:“最差程序员”带动高效团队、不写代码的创业导师如何毁掉创新…
前端·后端·设计模式
砍光二叉树12 小时前
【设计模式】结构型-代理模式
设计模式·系统安全·代理模式
不秃不少年14 小时前
单例模式 (Singleton)
单例模式
新缸中之脑14 小时前
AI智能体五大设计模式
人工智能·机器学习·设计模式
砍光二叉树15 小时前
【设计模式】结构型-装饰器模式
设计模式·装饰器模式
han_15 小时前
JavaScript设计模式(三):代理模式实现与应用
前端·javascript·设计模式
我的offer在哪里15 小时前
POM 设计模式深度解析|博客视角:从原理到落地,让自动化测试脚本 “活” 起来
设计模式
程序员Terry15 小时前
Java 代理模式:从生活中的"中介"到代码中的"代理人"
后端·设计模式
砍光二叉树15 小时前
【设计模式】结构型-适配器模式
设计模式·适配器模式
Yu_Lijing16 小时前
基于C++的《Head First设计模式》笔记——蝇量模式
c++·笔记·设计模式