![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码解析
文章平均质量分 73
雨夜归人93
这个作者很懒,什么都没留下…
展开
-
浅析RocketMQ-NameServer和他的定时任务们
NameServer启动过程中,会启动几个定时任务,本文将介绍下这些任务都做了什么操作。一.scanNotActiveBrokerscanNotActiveBroker 这个定时任务,每隔10秒执行一次,用于移除那些失效的broker。在进入scanNotActiveBroker 逻辑前,先看下broker如何注册到NameServer。明白了如何注册,对于移除就更便于理解了。1. 注册broker注册处理入口在DefaultRequestProcessor.processRequest里面p原创 2022-05-21 14:25:21 · 658 阅读 · 0 评论 -
浅析RocketMQ-NameServer启动
本文以RocketMQ-4.9.3分析。NameServer是一个简易的注册中心,实现了Broker的动态注册与发现功能,提供Producer和Conumser查询Broker的路由信息等。本文主要对其启动流程进行分析,首先来到namesrv工程下的NamesrvStartup类,main方法里面就两个步骤生成NamesrvController对象启动NamesrvControllerpublic class NamesrvStartup { public static void mai原创 2022-05-18 21:28:32 · 392 阅读 · 0 评论 -
SPI-自由扩展的入口
本文基于jdk1.8一.SPI是何物?SPI是Service Provider Interface的缩写,用于解耦服务接口与其具体实现。java编程中最常见的SPI实现是解耦数据库驱动。想想平时引入mysql或者postgresql的jar就能连上数据库,是不是很神奇。二. 快速实现SPI接口来动手写一个demo,熟悉下。1. 定义一个用户服务,及其实现public interface UserService { String getUserName(long userId);}原创 2021-06-30 16:30:53 · 236 阅读 · 0 评论 -
ReentrantReadWriteLock-大家一起读
本文基于jdk1.81.简介在本文中与《面向java–ReentrantLock》中一致的方法,不在重复说明。ReentrantReadWriteLock出现是为了解决读多写少的场景出现的,在读读的场景下不互斥,从而提高并发效率。其继承关系如下二.源码解析1.基本属性 // 读锁 private final ReentrantReadWriteLock.ReadLock readerLock; // 写锁 private final ReentrantReadWriteLock.W原创 2020-07-25 22:23:00 · 67 阅读 · 0 评论 -
ReentrantLock-多重上锁,再也不怕丢东东了
本文基于jdk1.81.简介Reentrant 直译过来是"可重入",很直白的表明是个重入锁.继承关系如下锁的具体实现通过内部的sync,其关系如下AbstractQueuedSynchronizer 是一个抽象类,提供了模板方法,子类只需重写lock,tryAcquire之类的方法,即可实现锁的完成功能.AbstractQueuedSynchronizer使用CAS+state实现锁,双向链表的结构实现线程等待.二.源码解析1.基本属性 private final Sync sync;原创 2020-07-24 14:08:00 · 143 阅读 · 0 评论 -
ThreadLocal-快,备份一下
ThreadLocal在平时工作中还是比较常见的类,作为一个解决多线程问题的一个途径,还是值得去学习下的.它的工作原理,简单的说就是ThreadLocal为每个线程创建一个本地副本变量机制,实现与其他线程的隔离.源码解析1.set 方法 public T get() { // 获取当前线程 Thread t = Thread.currentThread(); ...原创 2019-12-18 14:30:06 · 122 阅读 · 0 评论 -
Thread-打断一下,插个广告 ^ - ^
本文基于jdk1.8一.那个Thread中断一下如何停止一个运行线程呢?很久以前通过stop(),这是属于抢占式的中断。强制停止一个线程,可能造成不可预估的后果。举个例子:例如正在玩游戏,耗时n久通过了,没存档,然后突然断电了。。。,这个后果是砸显示器还是砸显示器呢。现在推荐调用interrupt(),这属于协作式中断。线程中断不代表线程的立即死亡,可能是中断返回等待新的任务,或是线程忙完任务选择合适的时机再死亡。这意味着,调用interrupt,只是标识了线程中断状态,至于要不要死亡或者什原创 2021-06-18 16:34:35 · 86 阅读 · 0 评论 -
AbstractQueuedSynchronizer-排队队吃果果
本文基于jdk1.8一.我是谁???AbstractQueuedSynchronizer 简称AQS,翻译过来是抽象队列同步器,是多线程访问共享资源的基类。CountDownLatch,ReentrantLock内部都有它的影子。AQS使用的等待队列是“CLH”(Craig、Landin 和 Hagersten)锁定队列的变体。CLH 锁通常用于自旋锁。二. AQS基石node作为AQS的基石,关键属性分类:有前后指针,表示最后组成一个双向链表支持共享和独占两种模式获取资源waitSta原创 2021-06-17 18:31:25 · 123 阅读 · 0 评论 -
ThreadPoolExecutor线程池-水太深你把握不住
本文基于jdk1.8线程池是池化技术的一种实现,是为了避免频繁创建线程而出现的。一. 构造方式最全的构造方法如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,原创 2021-06-16 18:34:53 · 90 阅读 · 0 评论 -
父子间的枢纽-InheritableThreadLocal
本文基本jdk1.8。日常开发中可以用ThreadLocal保存本线程的专属数据。但是要进行并行操作时,如果将父线程数据传递给后续的子线程呢?答案是InheritableThreadLocal。1.InheritableThreadLocalInheritableThreadLocal源码比较简单,继承自ThreadLocal,不了解的可以参考之前ThreadLocal的解析。public class InheritableThreadLocal<T> extends ThreadLo原创 2021-06-09 21:27:07 · 62 阅读 · 0 评论 -
浅析FastThreadLocal
FastThreadLocal是啥?它本质上还是一个ThreadLocal。但从它的名称,可以知道它比普通的ThrealLocal要快。构造函数实例FastThreadLocal时,获取一个在InternalThreadLocalMap中的索引标识。InternalThreadLocalMap就是一个挂羊头卖狗肉的,内部使用一个数组存数据。 // 用于标志在InternalThreadLocalMap的位置 private final int index; public FastThr原创 2020-12-13 19:33:33 · 874 阅读 · 0 评论 -
浅析mybatisPlus启动流程
文中都是与mybatis-spring比较,与之相同之处,本文不再赘述。对于启动流程不清楚的,可参考浅析MybatisAutoConfiguration流程1. MybatisPlusAutoConfiguration区别MybatisAutoConfiguration:类注解部分引入的配置类换成了MybatisPlus定义的。afterPropertiesSet方法多了一步设置自定义配置的过程sqlSessionFactory内部变更,使用MybatisSqlSessionFactoryBe原创 2020-10-15 22:37:38 · 1735 阅读 · 0 评论 -
浅析MybatisAutoConfiguration流程
本文主要讲述springboot整合mybatis的自动配置流程。1. MybatisAutoConfigurationMybatisAutoConfiguration是一个配置类,主要是注入SqlSessionTemplate,SqlSessionFactory,以及注册@Mapper标注的类。 @Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource原创 2020-10-14 20:21:00 · 821 阅读 · 0 评论 -
mybatis流程浅析
写了这么久的项目,都没怎么看过mybatis的源码。趁着周末,简单梳理了下。一.基本流程大体流程如图所示二.构建建议demo参照官方文件构建一个简易的demo,便于debug参看的源码信息。项目大体结构如下图,主要文件为图中已标出DO操作对象public class UserDO { private Long id; private String username; private Integer age; ....get/set}DAO对象publ原创 2020-09-26 20:55:06 · 75 阅读 · 0 评论 -
浅析@MapperScan原理
@MapperScan 是spring用于批量注入mybatis映射器(DAO接口)的注解。与之相对应@Mapper进行单个注册。源码如下:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MapperScannerRegistrar.class)@Repeatable(MapperScans.class)public @interface MapperScan { // 指定原创 2020-10-13 22:01:29 · 6129 阅读 · 0 评论