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的失败。

  • 相关阅读:
    C语言学习019:函数指针
    C语言学习018:strdup复制字符串数组
    C语言学习017:malloc和free
    C语言学习016:单链表
    C语言学习015:联合(union)与枚举(enum)
    C语言学习014:结构化数据类型
    C语言学习013:通过make编译C源代码
    C语言学习012:将代码文件分成多个文件
    C语言学习011:带参数的main函数
    C语言学习010:fopen读写文件
  • 原文地址:https://www.cnblogs.com/fuyoucaoyu/p/6547715.html
Copyright © 2011-2022 走看看