![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
底层原理
文章平均质量分 94
各种源码原理
小咸鱼的技术窝
独立全栈开发工程师一枚,熟读JDK、SSM、SpringCloud生态源码。
个人产品:www.xxyfy.cn
微信公众号:小咸鱼的技术窝
个人微信:zh114418
展开
-
Redisson源码研究(包括底层Netty、Promise实现)
纯纯自己一遍遍 debug 的源码,限于文章篇幅,只保留关键节点源码,持续更新。原创 2023-12-11 10:34:38 · 1103 阅读 · 0 评论 -
深度理解 Spring 动态数据源切换是如何实现的
小憩是辣么的让人神往,就像备战高考靠窗位置的那个你,肆无忌道的放空自己,望着深蓝色宁静的天空,思考着未来该何去何从,近处一颗高大魁梧的银杏树在炎炎夏日中尽情的摇曳着自己嫩绿的枝丫,迸发出无尽的希望,回想起来一切都是这么的美好。好了今日的杂想到此结束,回归正文,关于动态数据源切换那点事。原创 2022-11-03 10:30:24 · 829 阅读 · 0 评论 -
手把手带你分析 (net.devh.boot.grpc 包下面的)服务端 Grpc 自动装配、服务注册的源码(Java版)
昨天写过一篇关于如何使用 Grpc 的博客,出于好奇想知道 @GrpcService、@GrpcClient、@GrpcGlobalServerInterceptor、@GrpcGlobalClientInterceptor这些注解是如何生效的,以及服务注册的流程是怎样的,就简单过了一遍源码,帮助大家梳理一下流程吧。原创 2023-05-26 10:39:43 · 1121 阅读 · 0 评论 -
CaffeineCache+Redis 接入系统做二层缓存,SPI 思路实现(借鉴 mybatis 二级缓存、自动装配源码)
现在手上有个系统写操作比较少,很多接口都是读操作,也就是写多读少,性能上遇到瓶颈了,正所谓前人栽树、后人乘凉,原先系统每次都是查数据库的,性能比较低,如果先查 redis,redis 没数据再查数据库的话,但是还可以更快,那就是使用内存查询,依次按照内存、redis、db的顺序从快到慢查询,可使系统整体的性能提升一个档次,但是仅限于读多写少的场景,写多读少的场景没必要搞这么多缓存,搞多了缓存一致性也是个问题,就好比 mysql 数据库的读多写少,我们可以用 MYISM 存储引擎。原创 2023-06-20 11:25:41 · 3741 阅读 · 0 评论 -
class.forName() 里面都发生了啥?一文搞懂 Spi 机制
左眼用来忘记你,右眼用来回忆你,不是我不爱你,只是哥一直在你心里,大家好我是一只摆烂的小咸鱼,今天给大家介绍 Java Spi 机制原理,以及 Spi 机制在我们身边的应用场景。🌸🌸如果本文对您有帮助 🌸🌸🌸🌸不妨点个免费的赞或者关注 🌸🌸🌸🌸这将成为我前进的最大动力🌸🌸🍉🍉微信公众号刚刚起步,后续有时间将录个视频放到公众号上面,时长大概 10 分钟左右,并且顺带带读者看一下源码,还有空的话会将以往所有写过的源码解读博文,也以视频的方式放到上面去,可以私我先转义哪一篇博文哦!!!🍉🍉。原创 2023-10-13 15:17:34 · 154 阅读 · 0 评论 -
雪花算法原理(设计原理、优缺点、如何改造它、以及应用)
在时间戳、工作台按最大值运算后,留给数据中心的有效运算位只有 17 位了,然后数据中心又左移了12 位,留给数据中心的参与运算的bit就只有5位了(17-12=5)。且雪花算法中的时间戳左移了 22 位,加上时间戳本身的 41 位,加起来就有 63 位了,加上第一位的符号位,就是 64 位,正好等于 long 类型的 64 位。由于时间戳占生成id的41 bit位,且这个时间戳是根据服务器时间生成的,一旦服务器时间回拨了一下,你就嗝屁了,可能会生成重复的 id。为什么雪花算法是 64 位的?原创 2023-11-24 10:41:11 · 1193 阅读 · 0 评论 -
手写 Mybatis-plus 基础架构(工厂模式+ Jdk 动态代理统一生成代理 Mapper)
基于对 Mybatis 源码的理解,决定自己手动复刻一个出来,一遍 debug 源码,一遍理解其设计原理,最终悟透,一篇源码级别的复刻文章由此产生原创 2023-08-21 15:48:40 · 1574 阅读 · 2 评论 -
别再跟我说你不理解 @Transactional 为什么会失效了!省流版解读
老早前精读过 @Transactional 的源码,现在有时间提炼提炼一下里面的精华出一期,从源码角度剖析 @Transactional 是怎么开启事务的?@Transactional 回滚流程又是怎样的?的角度出发,帮助大家工作中合理的使用 @Transactional 这个注解。原创 2023-11-10 16:02:11 · 207 阅读 · 0 评论 -
浅聊一下,可中断锁(ReentrantLock)
今天早上上厕所,上的我痔疮犯了,屁股一坐下去就感觉一根针在刺我,得的是外痔,之前还坚持用痔疮膏来着,但是感觉涂药的那个姿势以及位置我实在无法忍受,就把它给断了,到头来还是屁股糟了罪,原创 2023-02-15 16:37:46 · 1080 阅读 · 0 评论 -
ReentrantLock源码探究、探究公平锁与非公平锁背后的奥秘
由于疫情,加上忙于工作的原因,也是有段时间没有写博客了,本文是基于以前写过的博客再整理出来的,本着加深理解的原则,发现以前的很多文章重新去温习的时候,读起来有点晦涩,于是萌生了再整理的想法,同时加了一个面试专栏,让大家各取所需首先简单介绍几个概念重量级锁:用户起了几个线程,经过os调度,然后在交给java虚拟机执行。重量级锁是操作os函数来解决线程同步问题的,涉及到了内核态与用户态之间的切换,这个开销是很大的,因此被称为重量级锁。轻量级锁。原创 2023-02-14 16:49:47 · 469 阅读 · 0 评论 -
将小部分源码设计精髓带入到开发中来(工厂模式、适配器模式、抽象类、监听器)
咋说呢,大学期间阅读过很多源码(Aop、Mybatis、Ioc、SpringMvc…),刚开始看这些源码的时候觉得云里雾里,一个没什么代码量的人突然去接触这种商业帝国级别的成品源码的时候,根本无从下手,这种感觉很难受,但是也庆幸自己熬过了那段难忘且充实的日子,随着自己代码量的慢慢增多,也开始慢慢的融入了自己的一点小思想带入到开发中来。就拿玩具工厂举例子。采用函数式约定一下工厂的规范。注意I,O是泛型,更具泛用性。并且结合了一下适配器模式,方法的返回值是Adapter。}/**}});...原创 2022-08-02 15:37:34 · 265 阅读 · 0 评论 -
Spring提供的BeanUtils源码剖析(附手写copyProperties方法)
不清楚JAVA内省的小伙伴,先来了解一下这方面的知识,何为内省?内省是JAVA提供的一组可以操纵 JavaBean 属性的一组 Api,掌握了这些个 Api 我们也可以写一个自己的 BeanUtils 出来。下面先来介绍一波这些个 Api。恭喜你已经通过了入职考核,有资格进入 zzh 盗版集团来,我们集团这里的人都是人中翘楚、人中龙凤、国之栋梁、梁之中流砥柱、柱中之无懈可击的存在了。下面列举一个 我司开发的山寨版BeanUtils.copyProperties()软件 给读者参观(),温馨提示:前方500米原创 2022-07-13 17:53:47 · 1259 阅读 · 1 评论 -
结合源码剖析Oauth2分布式认证与授权的实现流程
前言最近在做登录、注册、鉴权相关的任务,由于是分布式项目编码起来稍许复杂,其中遇到了些许难题,特此记录一下吧。Oauth2 密码模式认证Oauth2 常用的俩种授权模式,其一:密码模式,其二:授权码模式。可能很多人对这俩种模式不是很熟希,下面将简短的介绍一下。授权码模式:微信扫码登录就是一个很好的例子,第三方应用想要高效快速的开发出一套登录系统,但是不想花太多时间去深层次开发自己的认证中心,微信作为一个拥有众多用户使用的一款app,它里面的用户都是真实的用户,于是乎微信利用Oauth2 为这原创 2022-06-21 15:30:51 · 741 阅读 · 0 评论 -
手把手debug自动装配源码、顺带弄懂了@Import等相关的源码(全文3w字、超详细)
现在是8月15号北京时间网上9点33,怎么说呢原创 2021-09-02 14:36:13 · 461 阅读 · 0 评论 -
对于tcp的一点点解读,不止是三次握手、四次挥手
面试了好几次都有被问到网络协议那些东西很头大,于是决定痛定思通,沉下心来好好研究一下TCP和UDP。首先来介绍一下TCP和UDP是啥。TCP:是一种面向连接的,可靠的基于字节流的传输层控制协议UDP:TODO我一想到tcp就是三次握手、四次挥手。这到底是个啥呢?之前也在网上看了很多资料,有的直接把linux源码翻出来了解释、还有的文章说的很晦涩什么SYN、ACK啥的,看了没多久也快忘记了,对于我这种小白来说显得并不是那么友好,还是自己淦!TCP模型tcp是个协议,分为很多层应用层 :不同通原创 2021-08-12 14:24:38 · 355 阅读 · 0 评论 -
知其然而知其所以然~线程池深入源码分析-手把手debug源码系列
本文将从为什么使用线程池 ?—> 线程池的使用方式----> 线程池源码逐步分析线程池为什么使用线程池?降低资源开销:通过重复利用已创建的线程降低创建销毁线程带来的开销提高响应速度:当有任务到达时,任务可以不需要等待线程创建就可以立即执行提高线程的可管理性:使用线程池可以对线程进行统一的监控管理线程池的常见创建形式有哪几种?通过Executors对象创建我们线程池ExecutorService executorService = Executors.newFixedThre原创 2021-05-31 11:49:24 · 336 阅读 · 1 评论 -
深入mybatis源码解读~手把手带你debug分析源码
emmm时隔一个多月没写博客了,我终于还是没忍住对mybatis这个框架下手了哈哈哈哈。搞懂源码就是爽啊mybatis是一款持久性的ORM框架,目的在于把数据库中的表中的信息转换成对象供我们操作,也就是说我们对数据库的操作有了mybatis可以转变为对对象的操作。mybatis是怎么实现的呢? 要记到一点市面上所有的ORM框架无论如何都离不开JDBC操作,我们所谓的mybatis也好hibernate也罢其实本质都是对JDBC的包装而已。先来回顾一下传统的JDBC操作步骤加载驱动获取连.原创 2021-05-22 20:20:23 · 3848 阅读 · 8 评论 -
spring mvc运行流程源码深度解析(同步debug效果更佳)
前言:Spring Mvc的设计主要围绕着DispatcherServlet来展开的,直接分析DispatcherServlet即可。个人理解SpringMvc其实就是一个Servelt Plus 。观察DispatcherServlet继承关系可以得出如下结论:DispatcherServlet其实就是一个Servlet,而 一个Servelt完整生命周期必然少不了 init()、service()、destory() 这几个步骤DispatcherServlet 继承到 HttpServlet原创 2021-04-26 16:13:07 · 549 阅读 · 5 评论 -
aop增强器执行流程,手把手带你debug (文章末尾有干货)
spring Aop运行流程新建一个切面,对目标对象的Before、After、Around、AfterThrowing、AfterReturning进行增强@Aspect@Componentpublic class MyAspectj { @Pointcut("execution(* com.zzh.demo.springAopSourceStudy.prepareBeans.targetObject.*(..))") public void targetObjectPoint()原创 2021-04-09 21:01:26 · 571 阅读 · 0 评论 -
spring 源码解析(配图文讲解)顺带搞懂了循环依赖、aop底层实现
平时用aop用的很爽,今天决定研究一下源码,基于spring+aspectj来讲AOP定义:一种切面的编程思想具体实现有:1:springAOP2:spring+aspectj底层实现:cglib、jdk动态代理@EnableAspectJAutoProxy(proxyTargetClass = false)这个注解添加上aop就可以正常运行,一删掉就失效了,那么就从这里分析开始吧|可以看到这其实是一个自定义注解,关键的地方在于@import,这个注解给AspectJAutoProxyRe原创 2021-04-07 16:16:17 · 494 阅读 · 1 评论 -
深入jdk动态代理源码解析
阅读源码前先清楚应用效果更佳 模拟jdk动态代理 本文着重于源码,一个小案例带你一步步分析jdk动态代理的源码????。曾几何时不知到读者有没有想过如下问题????newProxyInstance()出来的对象和我们的myTargetObject对象有什么不同?为啥jdk代理只为实现类的代理、而不为继承类的代理?为啥jdk生成的代理对象居然不支持类型转换为目标对象!?jdk代理中的invoke方法执行时机是什么时候?proxy.say(); 中发生了什么,能大概讲讲吗?@Test p原创 2021-04-04 11:51:34 · 215 阅读 · 0 评论 -
ThreadLocal还存在内存泄漏?源码级别解读
前言:ThreadLocal平常用的比较少,但是面试有被问到好多次、痛定思痛准备花几天自己好好看一下源码。小白看源码系列,以后有更深层次的研究,在将博客更新plus,我的技术在长大、我的博客亦然要长大。threallocal到底是个啥东东呢?下面一段话摘自源码This class provides thread-local variables. These variables differfrom their normal counterparts in that each thread that a原创 2021-03-09 21:16:28 · 292 阅读 · 0 评论 -
arraylist原理探究,年轻人不讲武德
This class is a member of the Java Collections Framework.arraylist是Collections中的一员,底层的存储数据结构是一个Object数组,这就意味着arraylist存放的数据类型只能为引用数据类型、NULL,引用数据类型包括(Integer、String、Boolean、Char、Byte、Float、Double、Long、Short)。而且。数组的优点有查询快、时间复杂度为o(1)。缺点:长度固定无法自动扩容transien.原创 2021-03-06 17:47:38 · 143 阅读 · 0 评论 -
模拟jdk动态代理(完整版)
实现思路1: 定义一个字符串s2:加载s利用流生成对应的java文件3:通过类加载器加载java文件生成class文件4:通过class生成代理对象5:测试成功我使用过jdk代理的场景1:通过拦截request对象,代理其中的get参数的方法来过滤敏感词2:通过阅读aop源码发现,底层用的也是动态代理(jdk,cglib)jdk代理的使用模拟之前我先聊一下jdk代理的使用,通过proxy.newProxyInstance(a,b,c)我们就可以生成一个代理对象了。参数a含义是需要被代理对原创 2020-09-04 20:05:44 · 309 阅读 · 0 评论 -
hashmap源码逐行解读基于jdk1.8
保姆式解析:我每一句代码都标了注释<注意看代码段中的注释>!!!!!!!!!!!!!!!!!!!!!!! // 序列号看源码前需要知道的变量private static final long serialVersionUID = 362498820763181265L; // 默认的初始容量是16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量static final int MAXIMUM原创 2020-07-09 12:33:36 · 346 阅读 · 0 评论 -
深度了解mysql事务mvcc实现原理
一:事务概念:一组原子性的sql查询语句,也可以看作是一个工作单元特点:要么全部执行成功,要么全部执行失败一个有效的事务需满足的条件(ACID)1:原子性(Atomicity)一个事务必须被视为一个单独的内部最小的,”不可分“的工作单元,以确保事务要么全部执行,要么全部执行失败,当一个事务具有原子性的时候,该事务绝对不会部分执行,要么全部执行,要么不执行。2:一致性(Consistency)数据库总是从一种一致性状态转换到另一种一致性状态,例如银行转账业务中的俩者金额总和的是不变的。这种一致性原创 2020-07-02 16:14:40 · 502 阅读 · 0 评论