ZooKeeper 分布式锁 Curator 源码 :可重入锁

2021-07-16
阅读 5 分钟
3.5k
一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。

Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

2021-07-15
阅读 2 分钟
2.1k
前言Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch。Semaphore意思就是在分布式场景下,只有 3 个凭证,也就意味着同时只会有三个线程执行业务。设置凭证参数列表:KEYS[1]:指定的 key 这里叫 semaphoreKEYS[2]:redisson_sc:{semaphore}ARGV[1]:凭证数 3这块 lua 脚本相对简...

Redisson 分布式锁源码 10:读写锁

2021-07-13
阅读 3 分钟
3.1k
前言Redisson 还支持可重入读写锁,允许在分布式场景下,同时有多个读锁和一个写锁处于加锁状态。使用读写锁Redisson 读写锁实现了 JUC 下的 ReadWriteLock,使用方式基本相同。源码加锁源码基本和之前的可重入锁加锁无区别,唯一的差异就是在 Lua 脚本这里。所以下面着重分析 Lua 脚本。读锁源码源码地址:org.redisson...

Redisson 分布式锁源码 09:RedLock 红锁的故事

2021-07-12
阅读 4 分钟
4.8k
所以本文会先介绍什么是 RedLock,当大家对 RedLock 有一个基本的了解。然后再看 Redisson 中是如何实现 RedLock 的。

Redisson 分布式锁源码 02:看门狗

2021-07-03
阅读 2 分钟
5.5k
前言说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制。本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的?加锁成功在前一篇文章中介绍了可重入锁加锁的逻辑,其中 RedissonLock#tryAcquireAsync 方法是进行异步加锁的逻辑。回顾一下这个方法的入参:waitTime:-1;leaseTime:-1,加锁时未指...

Redisson 分布式锁源码 01:可重入锁加锁

2021-07-02
阅读 4 分钟
4.5k
前言相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题!单系统很容易想到 Java 的各种锁,像 synchronize、ReentrantLock 等等等,那分布式系统如何处理?当然是使用分布式锁。如果小伙伴不知道什么是分布式锁,那推荐看看石杉老师的突击课或者在网上搜一搜相关资料。当使用 Redis 作为分布式锁...

Spring @Transactional 注解是如何执行事务的?

2021-06-25
阅读 5 分钟
5.2k
前言相信小伙伴一定用过 @Transactional 注解,那 @Transactional 背后的秘密又知道多少呢?Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢?画图猜测在开始 debug 阅读源码之前,小伙伴们应该已经知道 MySQL 是如何开启事务的。因此可以得出猜测:那下面跟着源码一起读一读,Spring 的 @Transactional ...

Spring 事务、异步和循环依赖有什么关系?

2021-02-02
阅读 4 分钟
2.3k
前言在循环依赖中有一种循环依赖,就是自注入:自己依赖自己。事务的自注入在 Spring 自调用事务失效,你是怎么解决的? 有小伙伴提出可以自己注入自己来解决事务失效。具体使用方式如下: {代码...} 是不是发现很神奇的事情,事务生效了。其实这里注入自己,其实是注入的一个代理对象,调事务,也是调的代理对象的事务...

Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

2021-01-31
阅读 6 分钟
3.5k
前言在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的。同样在上一节留下了疑问:循环依赖为什么要使用三级缓存?而不是使用二级缓存?AOP 动态代理对循环依赖的有没有什么影响?本篇文章也是围绕上面的内容进行展开。笔记也在不断整理,之前可能会有点杂乱。循序渐进,...

Spring 是如何解决循环依赖的?

2021-01-26
阅读 5 分钟
16.5k
Requested bean is currently in creation: Is there an unresolvable circular reference?

Spring 源码学习 16:单例 Bean 创建

2021-01-21
阅读 13 分钟
1.8k
在 finishBeanFactoryInitialization 中介绍了创建 Bean 的流程大概流程,这里进入单例 Bean 的创建过程。

Spring 源码学习 15:finishBeanFactoryInitialization(重点)

2021-01-19
阅读 16 分钟
2k
前言可以说前面的都是准备工作,而接下来开始的才是重点,在这一步会完成 BeanFactory 的初始化,同时实例化单例 Bean。具体怎么操作的,那就一起阅读源码吧!不过在阅读源码之前,还是需要了解一些知识的。什么是 FactoryBean ?FactoryBean 是如何使用的 ?Bean 是如何初始化的?常说的循环依赖是怎么解决的?什么是 F...

Spring 源码学习 14:initApplicationEventMulticaster、onRefresh

2021-01-13
阅读 5 分钟
1.8k
上一篇介绍了国际化的使用以及初始化消息源的源码,接下来接着往下阅读,将进入 initApplicationEventMulticaster 、onRefresh 和 registerListeners 的相关操作逻辑。

Spring 源码学习 13:initMessageSource

2021-01-04
阅读 4 分钟
1.8k
在阅读完 registerBeanPostProcessors 源码之后, 下一步就进入到 initMessageSource,这一步主要作用是初始化国际化文件。

Spring 源码学习 12:registerBeanPostProcessors

2021-01-02
阅读 7 分钟
2.4k
前面通过 invokeBeanFactoryPostProcessors 这一步了解到了什么是 BeanFactoryPostProcessor ,以及 BeanFactoryPostProcessor 的使用及作用,并通过 invokeBeanFactoryPostProcessors 这一步源码,对 BeanFactoryPostProcessor 的加载流程有了进一步了解。

Spring 源码学习 11:invokeBeanFactoryPostProcessors

2020-12-28
阅读 14 分钟
1.6k
知道了上面两个问题的答案,对 BeanFactoryPostProcessor 有了了解之后,然后再深入源码,继续阅读 invokeBeanFactoryPostProcessors 这个方法。

Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory

2020-12-27
阅读 4 分钟
2.8k
根据 refresh 流程,当 obtainFreshBeanFactory 执行结束后,下一步会执行 prepareBeanFactory ,顾名思义,这个方法主要是准备 BeanFactory,下面一起看一看这部分逻辑。

Spring 源码学习 08:register 注册配置类

2020-12-23
阅读 2 分钟
1.8k
前言看完无参构造的源码及流程之后,后面将会执行 register 方法。register 方法,入参是我们的配置类 JavaConfig.class ,下面跟着源码继续往下走!源码分析this.reader.register(componentClasses);这里执行的是 reader 的方法,入参就是传入的 JavaConfig.class。reader 在之前初始化,就是注册一些 PostProcessor。...

Spring 源码学习 07:ClassPathBeanDefinitionScanner

2020-12-15
阅读 2 分钟
1.1k
AnnotationConfigApplicationContext 构造函数除了初始化一个 reader ,还有一个 scanner,下面来一起看看 ClassPathBeanDefinitionScanner 都有什么逻辑。

Spring 源码学习 06:AnnotatedBeanDefinitionReader

2020-12-10
阅读 2 分钟
1.6k
前言BeanDefinition 的概念也了解了,也知道一个 Bean 在 Spring 中定义的信息有哪些之后,继续言归正传。源码分析在初始化时会先生成一个 reader ,进入方法,其实是走的下面的逻辑:其中 getOrCreateEnvironment(registry) 会返回一个 Environment 用来表示当前的运行环境之类的。ConditionEvaluator 是用来完成对 @Co...

Spring 源码学习 05:BeanDefinition 概念及其实现

2020-12-08
阅读 3 分钟
1.4k
BeanDefinition:顾名思义,就是 Bean 的定义,是用来描述一个 Bean 都有什么信息。前面说在初始化 DefaultListableBeanFactory 时,会初始化一个 Map<String, BeanDefinition>,这个 Map 的功能暂且不说,(PS:查资料说的是存储 bean),所以今天就结合官方文档以及源码,一起了解一下 BeanDefinition!

Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

2020-12-03
阅读 3 分钟
1.6k
在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程。

Spring 源码学习 03:创建 IoC 容器的几种方式

2020-12-02
阅读 2 分钟
1.1k
前言在上一篇文章末尾画了一幅简图,现在从简图这入手,先来看看如何创建容器!创建容器在搭建 Spring 源码阅读环境 时,最后举了一个例子,其实就是创建容器,并从容器中获取 Bean ,来测试环境是否 OK。根据元数据的不同,创建容器的方式也不同,下面参考官方文档,简单介绍下创建容器的几种方式:Java 配置获取元数据...

Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念

2020-12-01
阅读 2 分钟
1.3k
前言在前一篇文章中介绍了如何构建源码阅读环境,既然构建好了源码环境,本地也可以正常运行,那就开始阅读源码吧!在阅读源码时,会参考官方文档,很多概念在官网都可以得到答案,有兴趣的小伙伴们可以继续阅读,当做复习,写的不足之处,希望多多指导。IoC 和 DIIoCIoC(Inversion of Control),即控制反转。之前是在...

Spring 源码阅读环境的搭建

2020-11-27
阅读 3 分钟
3.8k
前言本文记录了 Spring 源码环境的搭建方式,以及踩过的那些坑!​当前版本:5.3.2-SNAPSHOT。环境准备GitJDKmaster 分支需要 JDK 115.2.x 分支, JDK8 即可Gradle 6.5.1IDEA 最新 (2020.2.3)Spring 源码仓库地址:[链接]下载源码clone 源码 {代码...} 使用 IDEA 打开等待 IDEA 加载完成即可。注: 也可以指定 clone 的...

线程池 ThreadPoolExecutor 原理及源码笔记

2020-11-16
阅读 8 分钟
1.1k
前言前面在学习 JUC 源码时,很多代码举例中都使用了线程池 ThreadPoolExecutor,并且在工作中也经常用到线程池,所以现在就一步一步看看,线程池的源码,了解其背后的核心原理。

写时复制集合 —— CopyOnWriteArrayList

2020-11-08
阅读 5 分钟
2k
前言JUC 下面还有一个系列的类,都是 CopyOnWriteXXX ,意思是写时复制,这个究竟是怎么回事?那就以 CopyOnWriteArrayList 为切入点,一起了解写时复制是怎么回事?

非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue

2020-11-08
阅读 5 分钟
3.8k
前言JUC 下面的相关源码继续往下阅读,这就看到了非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue,来一起看看吧。

APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!

2020-11-08
阅读 10 分钟
5.2k
前言部署测试,部署预发布,一切测试就绪,上生产。发布生产闪退What???马上回滚开始排查后端一模一样的代码,不是 APP 端的问题吧。可 APP 端没有发版啊。…… 一番排查原来是 APP 端打包,测试和预发布包 Header 传的都是 Authorization ,生产传的是 authorization 。就是大小写问题,那赶紧改。

基于链表的有界阻塞队列 —— LinkedBlockingQueue

2020-11-08
阅读 6 分钟
2.6k
前言上一节看了基于数据的有界阻塞队列 ArrayBlockingQueue 的源码,通过阅读源码了解到在 ArrayBlockingQueue 中入队列和出队列操作都是用了 ReentrantLock 来保证线程安全。下面咱们看另一种有界阻塞队列:LinkedBlockingQueue。