知识卡片

静态内部类延迟

普通读书笔记卡 · 1536.a

内容

静态内部类单例利用 JVM 类加载机制本身的线程安全性实现懒加载:外部类加载时不会触发内部类 LazyHolder 的加载初始化,只有首次调用 getInstance() 访问 LazyHolder.INSTANCE 时才加载,而类初始化由虚拟机保证只执行一次且线程安全。相比 [[DCL必须配volatile]],它不需理解指令重排细节,把并发控制交给类初始化机制。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第8章《高并发设计模式》8.1.5节《使用静态内部类实现懒汉式单例模式》(源文件:_epub-src/OEBPS/Text/chapter262.xhtml) - 结论依据:原文说明“使用静态内部类实现懒汉式单例模式只有在getInstance()被调用时才去加载内部类并且初始化单例,该方式既解决了线程安全问题,又解决了写法烦琐问题”,并对比指出双重检查锁+volatile“底层原理比较复杂,写法烦琐”,因此推出本卡结论。 - 原始内容:虽然通过双重检查锁+volatile相结合的方式能实现高性能、线程安全的单例模式,但是该实现的底层原理比较复杂,写法烦琐……使用静态内部类实现懒汉式单例模式只有在getInstance()被调用时才去加载内部类并且初始化单例,该方式既解决了线程安全问题,又解决了写法烦琐问题。