Java-延迟加载的单例模式

所有java的版本里,这个方法都能达到安全高效的实现高并发的延迟初始化。

Code:

public class Something {

    private Something() {}

    private static class LazyHolder {

        private static final Something INSTANCE = new Something();

    }

    public static Something getInstance() {

        return LazyHolder.INSTANCE;

    }

}

这种实现依赖于在JVM中初始化阶段的特性,这在java 语言说明里有交代。当一个类被JVM加载,这个类就会历经初始化的过程。既然这个类没有其他静态的变量需要初始化,那么初始化过程就会顺利完成。而定义在类里面的静态类LazyHolder直到JVM确定LazyHolder一定会被执行时才会去初始化。当静态方法getInstance调用时,静态类LazyHolder才会被执行,当这件事第一次发生时,JVM就会去加载并初始化LazyHolder。

LazyHolder 的初始化导致了静态变量INSTANCE因为外部类(就是指LazyHolder)执行私有的构造器而被初始化。由于类的初始化过程是串行的(由java语言说明保障),就无需并行同步操作了。

并且,因为初始化阶段在串行操作里写入静态变量INSTANCE,所有接下来的并行调用getInstance方法会正确返回相同的INSTANCE,而不需要额外的同步开销。

官方软文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,764评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,914评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,366评论 11 349
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 6,884评论 12 68
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,538评论 1 8