zoukankan      html  css  js  c++  java
  • idiom

    参考:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

    idiom - 一个线程安全的、无需synchronization的、且比无竞争的同步高效的单例模式

    public class Something {
        private Something() {}
    
        private static class LazyHolder {
            private static final Something INSTANCE = new Something();
        }
    
        public static Something getInstance() {
            return LazyHolder.INSTANCE;
        }
    }
    


    idiom的实现依赖于java虚拟机(JVM)在执行初始化阶段的特性,由java语言规范规定(JLS)。
    当一个类被JVM加载,这个类就会历经初始化的过程。由于该类没有任何静态变量的初始化,初始化就会顺利完成。而定义在类里面的静态类LazyHolder直到JVM确定LazyHolder一定会被执行时才会去初始化。当静态方法getInstance调用时,静态类LazyHolder才会被执行,而当这件事第一次发生时,JVM才会去加载并初始化LazyHolder。LazyHolder 初始化时,就会初始化静态变量INSTANCE,就会执行外部类私有的构造器并赋值给INSTANCE。
    由于类的初始化过程是串行的(JLS),就不会同时发生,也不需要同步操作。
    并且,因为初始化阶段在串行操作里写入静态变量INSTANCE,所有接下来的并行调用getInstance方法会正确返回相同的INSTANCE,而不需要额外的同步开销。

    这种线程安全的、无需synchronization的、且比无竞争的同步高效的单例模式,只能应用在构造函数保证不会失败的情况。
    在大多数JVM的实现中,如果一个构造函数失败,随后试图通过同一个类装载器初始化它的都会导致一个NoClassDefFoundError的失败。

  • 相关阅读:
    车载OS盘点及特点分析一:车载OS几大系统介绍
    CTF常用软件/工具
    汽车软件产业研究报告(2020年)
    高级加密标准(AES)分析
    工具 | CTP、SimNow、NSight、快期
    CTF之图片隐写术解题思路
    V2X和车路协同研究:5G V2X将成为数字座舱标配
    腾讯安全正式发布《IoT安全能力图谱》
    Microsoft Remote Desktop Beta 下载地址
    密码学初探|加密模式
  • 原文地址:https://www.cnblogs.com/fuyoucaoyu/p/6547715.html
Copyright © 2011-2022 走看看