【单例深思】饿汉式与类加载

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南 本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。 阅读详情
我们知道饿汉式的实现是线程安全的,没有延迟加载(Lazy Loading),下面我们深入研究下为什么。

饿汉式的实现如下:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {}
    public static Singleton getSignleton(){
        return singleton;
    }
}  

在介绍饿汉式时我们大多会说这种实现是线程安全的,实例在类加载时实例化,有JVM保证线程安全。虚拟机是怎么保证饿汉式实现的线程安全?

先介绍类生命周期的7个阶段,前面的5个阶段为类加载阶段,每个阶段作用不详细介绍了:




   首先,singleton 作为类成员变量的实例化发生在类Singleton 类加载的初始化阶段,初始化阶段是执行类构造器<clinit>() 方法的过程。

   <clinit>() 方法是由编译器自动收集类中的所有类变量(static)的赋值动作和静态语句块(static{})块中的语句合并产生的。因此,private static Singleton singleton = new Singleton();也会被放入到这个方法中。

   虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。需要注意的是,其他线程虽然会被阻塞,但如果执行<clinit>()方法的那条线程退出<clinit>()方法后,其他线程唤醒后不会再次进入<clinit>()方法。同一个类加载器下,一个类型只会初始化一次。

回答了线程安全的问题,我们再看看这个实现为什么不是延迟加载的?

    什么情况下需要开始类加载过程的第一个阶段——加载,Java虚拟机规范中没有进行强制的约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范则是严格规定了有且只有以下5种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前完成)。

  1. 遇到new, getstatic, putstatic, invokestatic这4条字节码指令时,如果类没有进行过初始化,由需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象,读取或设置一个类的静态字段(被fina修饰的静态字段除外,其已在编译期把值放入了常量池中),以及调用一个类的静态方法。
  2. 使用java.lang.reflect包的方法 对类进行反射时,如果类没有进行过初始化,由需要先触发其初始化。
  3. 初始化一个类的时候,如果发现其父类还没有进行初始化,由先触发其父类的初始化。
  4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟杨会先初始化这个主类。
  5. 当使用JDK 1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。

注意到第一条中的new字节码指令会触发初始化,因为private static Singleton singleton = new Singleton();中就有使用new关键字的情况,可知一旦触发初始化<clinit>() 方法执行,singleton 就会被分配内存完成实例化。单例模式下大部分情况下是调用静态方法getSignleton()被触发初始化,但是也不能100%保证,上述5种情况下,任何一种都会触发初始化,于是就能解释为什么饿汉式不是延迟加载了。

参考:《深入理解Java虚拟机 JVM高级特性与最佳实践》











PCB线路板的制作工艺流程分享!2021-08-21 Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体 阅读详情

相关推荐

KNX智能家居工程设计应用

KNX,是一个起源于欧洲的总线标准,主要应用于家居和楼宇中,对末端电气设备进行总线式的控制,比如照明、空调、地暖、电动窗帘和遮阳设备等等。根据2017年英国著名咨询公司BSRIA的数据报告显示,在中国的智能家居和灯光控制市场,KNX产品的市场份额为各类产品中排名第一,占据了42%的市场份额,远远领先于其他的标准协议。设备中一个继电器表示一路输出,某些功能可能需要用到多个输出,比如1个窗帘AC输出需要占用两路继电器输出,一个继电器用于控制正转,一个用于控制反转,而普通开关输出则需要占用一路继电器输出即可。

hhhh5555666的博客 934

单例模式之饿汉模式(立即加载)

单例模式或许都知道,即某个系统只有一个实例。 什么是立即加载?立即加载就是使用类的时候已经将队形创建完毕,常见的方法就是直接new实例化。 代码基本模式如下: public class MyObject { // 立即加载方式==饿汉模式 //静态成员变量,且一开始就直接创建对象。 private static MyObject myObject = new MyObject();

anLA_的专栏 1800

PCIe链路训练Recovery状态机:从RcvrLock到链路稳定的关键路径

本文深入解析PCIe链路训练中的Recovery状态机,特别是RcvrLock状态的关键作用。从Block对齐、均衡预设值应用到状态转移条件,详细介绍了确保链路稳定的技术要点,并提供了高速率下的特殊处理方法和常见问题排查指南,帮助工程师解决PCIe链路不稳定问题。

weixin_28739079的博客 174

lazy初始化和饿汉式饿加载

java

Leo_Wcg的博客 235

滑模控制算法——基本原理(附MATLAB程序)

选择一个滑模面和是设计参数。是滑模面函数,通常我们希望系统状态在的面上滑动。我们以一个简单的二阶系统作为示例,其状态空间方程为:是系统矩阵是输入矩阵是输出矩阵假设我们的系统如下:滑模控制算法的核心在于设计合适的滑模面和控制律,并分析系统在滑模面上的稳定性。通过上述公式和步骤,可以有效地设计滑模控制器,以处理具有非线性和不确定性的动态系统。总的来说,滑模控制算法因其鲁棒性和灵活性在处理复杂控制问题中表现出色,但在实际应用中需要精心设计以克服抖振现象和其他潜在问题。BuxuABDC。

qq_35623594的博客 2万+

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2402

设计模式(1)——单例模式

单例模式是一种确保类仅有一个实例的设计模式。本文介绍了四种实现方式:1)饿汉式(类加载时创建实例,线程安全但可能浪费内存);2)懒汉式(使用时创建实例,需双重检查保证线程安全);3)静态内部类(利用JVM类加载机制实现延迟加载和线程安全);4)枚举类(最简单安全的实现方式)。每种方式都通过代码示例演示,并验证了线程安全性。其中枚举方式最为简洁,推荐使用。这些实现方法各有特点,可根据具体场景选择适合的方式。

m0_70325779的博客 855

MATLAB机械臂轨迹规划:在关节空间中生成多项式轨迹以及 jtraj函数(内容超详细讲解)

matlab机器人仿真,关节空间多项式轨迹生成

qq_40969179的博客 1万+

C++设计模式(1)-- 单例模式

单例模式C++版本学习记录

Solititude的博客 1321

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 315

Uni-App 使用极光推送完整指南

Uni-App集成极光推送的完整指南:从注册极光账号到代码实现。包含前期准备(获取AppKey、注册厂商账号)、Uni-App配置(插件导入、初始化代码)、高级功能(角标设置、Java后台接口)及常见问题排查。详细说明了推送监听、registrationID获取、消息接收处理等核心功能实现步骤,并提供两种推送接口示例(按平台推送和统一推送)。适合需要在Uni-App项目中实现推送功能的开发者参考。

cyj0919的博客 425

多线程编程 单例模式(饿汉模式,懒汉模式)

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。我们为什么需要用到单例模式呢?当我们的程序需要对某一个特定的对象进行很多次的操作的时候,如果每次都对这个对象进行创建,那么我们的程序的开销就会非常的大。为了避免对同一个对象多次进行重复的创建,我们就诞生出了单例模式,单例模式只会在内存中创建一次对象,程序需要这个对象的时候就可以直接调用单例模式中的对象,不需要重新创建对象,能够大大节省程序的开销。

m0_62747332的博客 741

【毕设实战】基于YOLOv8的HRSC2016船舶智能检测系统开发全指南(含可视化UI界面,打造海事领域高分毕设)

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

know_F0727的博客 130

【单例深思】饿汉式

1、抛出问题 为什么饿汉式单例是线程安全的? 为什么饿汉式单例没有延迟加载(Lazy Loading)? 2、JVM类加载机制 饿汉式单例的实现: public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() {} public static Singleton getInstance() {

何武昭的专栏 268

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【单例深思】枚举实现单例原理

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。 其实现非常简单,如下: public enum Singleton {     INSTANCE;     private Singl

InkGenius 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

springboot 单例_如何实现一个单例及优化

前言社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。知识改变命运,学习成就未来。爱拼才会赢!程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:。https://github.com/ITfqyd/cxyxs社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间越长,越发感觉自己技术越菜,有同感的社友,可以在下方留言。现侧重于java底层学习和算法结构学习,希...

weixin_39805998的博客 2641

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Design pattern ——singleton pattern(单例总结深思)

Talk is cheapShowmethecode 个人学习笔记--仅供参考 单例模式可以保证内存里只有一个实例,减少了内存开销;可以避免对资源的多重占用。 单例模式看起来非常简单,实现起来其实也非常简单。 总结一下, 前几章主要讲了 饿汉式: 1,经典饿汉式 2静态代码块饿汉式 优点:没有加任何的锁、执行效率比较高,在用户体验上来说,比懒汉式更好。 缺点:类加载的时候就...

xuedengyong的博客 156

【单例深思】静态内部类实现详解

静态内部类实现是我个人比较推荐的,其实现如下: public class Singleton {     private static class SingletonHolder {         private static final Singleton INSTANCE = new Singleton();     }     private Singleton()

InkGenius 2015

枚举单例 最安全的单例,可以有效防止反射,序列化

  单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。 其实现非常简单,如下: public enum Singleton {     INSTANCE;     private Singleton()...

qq_39843374的博客 2232

【单例深思】Java 单例模式全解

什么是单例模式? 单例模式 是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例,并提供一个访问它的全局访问点。 单例模式的用途? 用于创建只需要一个实例的场景。 怎么实现单例模式? 单例模式的实现中有几个共同特点: 使用 private 声明类构造函数,这样就不能通过new 声明这个

InkGenius 843

《面试宝典》二 如何实现一个单例及优化

前言: 社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间越长,越发感觉自己技术越菜,有同感的社友,可以在下方留言。现侧重于java底层学习和算法结构学习,希望自己能改变这种现状。 为什么大厂面试,更侧重于java原理底层的提问,因为通过底层的提问,他能看出一个人的学习能力,看看这个人的可培养潜力。随着springboot的流行,大部分的开发,起步就是springboot。也不...

程序猿学社的博客 5142

枚举实现单例原理:线程安全及发序列化依旧为单例原因

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。 其实现非常简单,如下: publi...

wangxizzz的博客 687

【单例深思】懒汉式改进版与内置锁

我们知道懒汉式的实现是延迟加载(Lazy Loading),但是不是线程安全的,下面我们深入研究下为什么。 懒汉式的实现如下: public class Singleton {     private static Singleton singleton;     private Singleton(){}     public s

InkGenius 1501

一次单例模式引发的深思

为了让博客看起来不那么深入,我觉得可以让加入一点故事情节~ 锻炼一下以后写不动代码改写小说的能力~ 最近准备找工作,这不今天就有家喊我去面试的;我一大早的就赶到了公司; 此处省略1万字跟面试官的客套话,直接进入正题; 面试官:小胡,你知道哪些设计模式阿? 我说:设计模式了解得不多,只知道单例模式跟工厂模式,装饰模式,适配器模式,享元模式,观察者模式; 面试官:哟,知道得还挺多的啊,行,先

world6的博客 691

枚举实现单例原理

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。其实现非常简单,如下:public enum Singleton {    INSTANCE;    private Singleton() {}}下面我们用一个枚...

幻听 825
上一篇: 【单例深思】Java 单例模式全解
下一篇: 【单例深思】懒汉式改进版与内置锁
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值