Eureka源码-double check单例模式运用
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单例模式运用相关推荐
- Eureka源码10-Server端(处理全量下载和增量下载请求)
0. 环境 eureka版本:1.10.11 Spring Cloud : 2020.0.2 Spring Boot :2.4.4 测试代码:github.com/hsfxuebao/s- 1. 处理 ...
- Eureka 源码解析 —— EndPoint 与 解析器
1. 概述 本文主要分享 EndPoint 与 解析器. EndPoint ,服务端点.例如,Eureka-Server 的访问地址. EndPoint 解析器,将配置的 Eureka-Server ...
- 微服务发现与注册之Eureka源码分析
作者:陌北有棵树,Java人,架构师社区合伙人! [一]微服务之服务发现概述 关于微服务,近年来可谓是大火,业界也吹刮着一种实践微服务的风潮.本人有幸在去年参与到一个向微服务过渡的产品,再结合自己所学 ...
- 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...
- Eureka源码分析
Eureka源码分析 Eureka server 入口: Spring.factories PS: 意味着如果加载EurekaServerAutoConfiguration成功,需要 @Conditi ...
- 【SpringClould】Spring Cloud Eureka源码分析
文章目录 1.概述 1.1 Eureka的一些概念 2.源码分析 2.1 Eureka Server源码 2.1.1 `@EnableEurekaServer`注解 2.1.2 EurekaServe ...
- android单例模式代码,设计模式(一):Android 源码中的单例模式
设计模式(一):Android 源码中的单例模式 2020-08-17 22:51 阅读数 57 <>什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的 ...
- 小视频源码,设计模式单例模式
小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...
- 4、Eureka 源码解析 之 Eureka Client 启动原理分析
在前面的一篇文章 3.Eureka 源码解析 之 Eureka Server 启动原理分析当中我们分析了一下 Eureka Server 的启动.在集群环境下 Eureka Server 相互之前需要 ...
最新文章
- iOS 预览word pdf 文件
- 设置访问权限_一项一项教你测等保2.0——Windows访问控制
- 信息安全系统设计基础第十周学习总结
- x264各个版本下载
- 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
- Turtle库的学习积累
- Mongodb 自动增长 自增id 实现
- c++ multimap的几个insert插入元素简单例子
- Android kotlin DataBinding 之 unresolved reference: BR
- 54 FI配置-财务会计-固定资产-主数据-更改评估组的关键词
- 【2】Docker数据卷
- vuex的命名空间有哪些_javascript – vuex中模块的命名空间究竟是什么
- 信息系统项目的应急预案方案_从环评到验收、排污许可证、应急预案,都应在项目什么阶段开展? 先后顺序是什么?...
- Perl 字符串截取函数substr
- Vue指令之v-show
- .config文件相关说明
- 无人车路径规划与控制综述
- Python:正则表达式 flags 参数
- 计算机基础文献检索考核,文献检索实验
- 合肥工业大学计算机保研,合肥工大(合肥工业大学保研去向)
热门文章
- Typora:Typora快捷键
- 加州圣塔克拉拉大学计算机专业,圣塔克拉拉大学在美国排位
- 国债期货matlab,Matlab和国债期货的那些事儿~(四)——关键利率法在利率风险管理中的运用...
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
- 第十二届全国大学生信息安全竞赛-RE部分WP(目前前两题,待更)
- UEFI 基础教程 (一) - 基于QEMU搭建UEFI开发环境(win/linux)
- 前端证券项目_富途证券WEB前端团队招募令
- win7程序关闭后弹出 程序兼容性助手 这个程序可能安装不正确 如果此程序没有正确安装,处理方式
- 中职中职计算机英语试题,中职英语试卷及参考答案
- [计算机网络笔记14] IPv4地址—定长子网掩码和变长子网掩码