1.在看源码之前,首先先解释一下什么是double check,以及单例模式中为什么需要double check来进行单例模式的创建?

double check,也叫双重检测,主要利用两次的判断进行校验当前单例的创建情况。

如下面的代码

 static volatile AbstractConfiguration instance = null;public static AbstractConfiguration getConfigInstance() {if (instance == null) {Class var0 = ConfigurationManager.class;synchronized(ConfigurationManager.class) {if (instance == null) {instance = getConfigInstance(Boolean.getBoolean("archaius.dynamicProperty.disableDefaultConfig"));}}}return instance;}
  • 首先第一层是instance == null , 他主要的作用是减少synchornized锁竞争的压力,避免在大量线程访问的情况下,导致锁升级为重量级锁,从而导致线程之间互斥而进行长时间堵塞,严重的甚至可能导致OOM的情况。所以加第一层可以有效的阻挡部分已经获取单例的线程再次进入,减少线程间锁的竞争压力。
  • 第二层: 主要是保证在获取锁后的线程确保实例是空的情况下在进行创建,保证了单例仅创建了一次。

如上情况,看似已经比较的完美了,但是还有会有问题,问题就出现在多线程调用的时候,由于单例创建的实例存在于公共内存中,当实例创建之后,其他正在创建的实例不一定立马就知道单例的变化,所以还需要一个修饰符Volitile,它不仅仅可以阻止执行过程中指令的重排序,还可以保证线程之间的可见性(通过MESI缓存一致性协议确定),让创建的实例保证有且仅有一个。

2.详细看看这个在Eureka源码中是如何使用的。

还是寻找入口点从EurekaBootstrap启动类入口。

public class EurekaBootStrap implements ServletContextListener {public void contextInitialized(ServletContextEvent event) {try {//进行环境初始化this.initEurekaEnvironment();this.initEurekaServerContext();ServletContext sc = event.getServletContext();sc.setAttribute(EurekaServerContext.class.getName(), this.serverContext);} catch (Throwable var3) {logger.error("Cannot bootstrap eureka server :", var3);throw new RuntimeException("Cannot bootstrap eureka server :", var3);}}}

紧接跟入如下代码:

protected void initEurekaEnvironment() throws Exception {logger.info("Setting the eureka configuration..");String dataCenter = ConfigurationManager.getConfigInstance().getString("eureka.datacenter");if (dataCenter == null) {logger.info("Eureka data center value eureka.datacenter is not set, defaulting to default");ConfigurationManager.getConfigInstance().setProperty("archaius.deployment.datacenter", "default");} else {ConfigurationManager.getConfigInstance().setProperty("archaius.deployment.datacenter", dataCenter);}String environment = ConfigurationManager.getConfigInstance().getString("eureka.environment");if (environment == null) {ConfigurationManager.getConfigInstance().setProperty("archaius.deployment.environment", "test");logger.info("Eureka environment value eureka.environment is not set, defaulting to test");}}

重点为如下语句:

   String dataCenter = ConfigurationManager.getConfigInstance().getString("eureka.datacenter");

继续跟入:

 public static AbstractConfiguration getConfigInstance() {if (instance == null) {Class var0 = ConfigurationManager.class;synchronized(ConfigurationManager.class) {if (instance == null) {instance = getConfigInstance(Boolean.getBoolean("archaius.dynamicProperty.disableDefaultConfig"));}}}return instance;}

这里就应用了如开始的double check 的代码 。整体的应用流程就是这样,全局创建一个配置实例。

总结

总体的流程图如下所示,需要的朋友可以下载研究保存。

Eureka源码-double check单例模式运用相关推荐

  1. Eureka源码10-Server端(处理全量下载和增量下载请求)

    0. 环境 eureka版本:1.10.11 Spring Cloud : 2020.0.2 Spring Boot :2.4.4 测试代码:github.com/hsfxuebao/s- 1. 处理 ...

  2. Eureka 源码解析 —— EndPoint 与 解析器

    1. 概述 本文主要分享 EndPoint 与 解析器. EndPoint ,服务端点.例如,Eureka-Server 的访问地址. EndPoint 解析器,将配置的 Eureka-Server ...

  3. 微服务发现与注册之Eureka源码分析

    作者:陌北有棵树,Java人,架构师社区合伙人! [一]微服务之服务发现概述 关于微服务,近年来可谓是大火,业界也吹刮着一种实践微服务的风潮.本人有幸在去年参与到一个向微服务过渡的产品,再结合自己所学 ...

  4. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...

  5. Eureka源码分析

    Eureka源码分析 Eureka server 入口: Spring.factories PS: 意味着如果加载EurekaServerAutoConfiguration成功,需要 @Conditi ...

  6. 【SpringClould】Spring Cloud Eureka源码分析

    文章目录 1.概述 1.1 Eureka的一些概念 2.源码分析 2.1 Eureka Server源码 2.1.1 `@EnableEurekaServer`注解 2.1.2 EurekaServe ...

  7. android单例模式代码,设计模式(一):Android 源码中的单例模式

    设计模式(一):Android 源码中的单例模式 2020-08-17 22:51 阅读数 57 <>什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的 ...

  8. 小视频源码,设计模式单例模式

    小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...

  9. 4、Eureka 源码解析 之 Eureka Client 启动原理分析

    在前面的一篇文章 3.Eureka 源码解析 之 Eureka Server 启动原理分析当中我们分析了一下 Eureka Server 的启动.在集群环境下 Eureka Server 相互之前需要 ...

最新文章

  1. iOS 预览word pdf 文件
  2. 设置访问权限_一项一项教你测等保2.0——Windows访问控制
  3. 信息安全系统设计基础第十周学习总结
  4. x264各个版本下载
  5. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
  6. Turtle库的学习积累
  7. Mongodb 自动增长 自增id 实现
  8. c++ multimap的几个insert插入元素简单例子
  9. Android kotlin DataBinding 之 unresolved reference: BR
  10. 54 FI配置-财务会计-固定资产-主数据-更改评估组的关键词
  11. 【2】Docker数据卷
  12. vuex的命名空间有哪些_javascript – vuex中模块的命名空间究竟是什么
  13. 信息系统项目的应急预案方案_从环评到验收、排污许可证、应急预案,都应在项目什么阶段开展? 先后顺序是什么?...
  14. Perl 字符串截取函数substr
  15. Vue指令之v-show
  16. .config文件相关说明
  17. 无人车路径规划与控制综述
  18. Python:正则表达式 flags 参数
  19. 计算机基础文献检索考核,文献检索实验
  20. 合肥工业大学计算机保研,合肥工大(合肥工业大学保研去向)

热门文章

  1. Typora:Typora快捷键
  2. 加州圣塔克拉拉大学计算机专业,圣塔克拉拉大学在美国排位
  3. 国债期货matlab,Matlab和国债期货的那些事儿~(四)——关键利率法在利率风险管理中的运用...
  4. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
  5. 第十二届全国大学生信息安全竞赛-RE部分WP(目前前两题,待更)
  6. UEFI 基础教程 (一) - 基于QEMU搭建UEFI开发环境(win/linux)
  7. 前端证券项目_富途证券WEB前端团队招募令
  8. win7程序关闭后弹出 程序兼容性助手 这个程序可能安装不正确 如果此程序没有正确安装,处理方式
  9. 中职中职计算机英语试题,中职英语试卷及参考答案
  10. [计算机网络笔记14] IPv4地址—定长子网掩码和变长子网掩码