- 博客(84)
- 资源 (35)
- 收藏
- 关注
原创 JDK源码系列:StringBuffer与StringBuilder对比
一、源码分析StringBuffer与StringBuilder的区别1、StringBuffer是多线程安全的,StringBuilder是多线程不安全的多线程安全指的是 多个线程同时对一个对象进行append 等操作,不会出现覆盖、丢失的情况。看下StringBuffer是如何做到多线程安全的:StringBuffer类中除了构造方法,几乎所有方法都加了synchronized关键字来保证线程...
2023-11-25 23:26:08
231
原创 聊聊微服务到底该如何划分
背景现在动不动就是微服务架构,但是微服务划分的合理与否会极大的影响开发过程中的复杂度,划分的重要性不言而喻,但是在微服务划分这条路上并没有银弹,有的说DDD可以解决微服务的划分问题,吕哥想说的是那只是理论上的,实际上影响微服务划分的因素众多,不能死搬教条,每个项目都有自己的特点和实际情况,我们要做的把理论与实际结合,把知识融会贯通,走“自己特色的项目道路”.一、单体系统分解成微服务...
2023-06-18 15:31:10
2621
原创 简单工厂、工厂方法、抽象工厂模式-这仨货的区别
要想明白这三玩意的区别就需要知道这三玩意的优缺点;之所以有三种工厂模式,就说明它们各有所长,能解决不同场景的问题;一、简单工厂模式UML图代码public class MobileFactory { public static Mobile getMobile(String brand){ switch (brand){ case "apple":...
2023-05-28 13:40:35
757
原创 JDK源码系列:ThreadLocal弱引用真的是过度设计吗?
在《码处高效:Java开发手册》这本书上详细描述了ThreadLocal的原理,也有过度设计的说法,难道弱引用设计真的没必要吗?对此老吕要仔细分析分析,ThreadLocal到底该不该使用弱引用设计。JDK作为构建Java应用生态的原始生产资料和工具,它的每一行代码相信都是经过深思熟虑的(也有考虑不周的,后续版本会标上废弃或者改进代码)。回忆ThreadLocal原理ThreadLocal本质是一...
2023-04-02 20:00:17
403
原创 JDK源码系列:ThreadLocalMap内存泄漏“自动回收的触发场景”分析
在前面的文章中老吕分析了ThreadLocal的实现原理,ThreadLocal的内存泄漏,ThreadLocalMap 失效条目清理原理,本文分析下ThreadLocal内存回收的触发时机。一、getEntry(key)触发时机:发生哈希冲突时触发getEntry逻辑如下:1、直接命中,返回Entry结束,此种场景不会触发内存回收(对应key存在且没有hash冲突的场景)2、没有直接命中,通过线...
2023-03-23 17:30:08
613
原创 JDK源码系列:ThreadLocalMap到底是如何清理失效节点的?
在前面的关于ThreadLocal的文章中提到了所谓的内存泄漏问题,同时也提到了ThreadLocalMap在某些场景下会主动清理坏掉的Entry来释放内存,要理解它是怎么做到的,就必须理解它是怎么解决哈希冲突的,尤其是“真删除”Entry后如何保证不影响后续Entry的查找问题一、哈希冲突的解决:线性探测法在线性探测法中插入和查找和修改都比较容易理解,难点在于删除动作,因为删除动作可能会影响后续...
2023-03-22 16:02:21
724
原创 JDK源码系列:讲清楚ThreadLocal内存泄漏的来龙去脉
一、ThreadLocal\Thread\ThreadLocalMap的内存模型在研究过程中还思考了几个小问题:1、线程结束后Thread对象会被释放吗?Thread对象是线程状态的一个影像,线程状态的变化会反应到Thread.getState()方法上。线程结束后会将Thread.state置为“TERMINATED”,但是Thread内存对象的回收还是和其它Java对象一样的规则。线程在未结束...
2023-03-13 23:25:25
320
1
原创 老吕架构-2022~2021年文章索引
为方便查询阅读,增加2022年、2021年文章目录索引2023年1月份基于域控的SSO单点登录2022年8月份设计模式-桥接模式2022年7月份重构的艺术2022年5月份手撕一个解决ThreadLocal数据跨线程传递的实用工具聊聊代码复用2022年4月份JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据JDK源码系列:ThreadLocal实现原理JDK源码系列:AQS(...
2023-02-16 09:51:43
183
原创 基于域控的SSO单点登录
大家好,好久不见,今天老吕给大家来一篇偏冷门知识的文章。一、需求大型集团企业内部会有许多业务系统,工作人员也往往需要登录多个业务系统才能完成工作,这就可能会存在一些问题1、多套账号与密码需要记录或者记忆2、多次登录,不太好的工作体验与工作效率二、解决方案问题的本质是需要一个企业内部工作人员办公时使用的单点登录SSO方案方案1:常用方案,统一账号系统,建立用户中心,统一用户创建与登录渠道,通过cas...
2023-01-15 20:05:41
2244
原创 设计模式-桥接模式
兄弟们,想写出好的Java代码,设计模式还是要烂熟于心的鸭。仔细理解实践每一种模式,体会设计模式之美。一、 模式定义桥接模式又叫接口模式。说白了就是将变化的部分抽象成接口,桥接模式是结构型模式,着重看下 结构上是如何实现的和应用场景。说到面向接口编程,那场景可多了去了,在基于Spring的工程架构中,是不是到处都是接口,可以看做是一种退化的桥接模式。桥接模式即将抽象部分与......
2022-08-14 22:54:11
312
原创 重构的艺术
在吗?在吗?在吗?---》不要慌,我还在经典重读:改善既有代码的设计一、重构的定义重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构:使用一些列重构手法,在不改变软件可观察行为的前提下,调整其结构。二、重构的时机1、如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便的达成目的,那就先重构那个程序,使特性的......
2022-07-10 22:31:53
225
原创 手撕一个解决ThreadLocal数据跨线程传递的实用工具
大家好,老吕在前面的文章中提到了如何解决不同场景下ThreadLocal数据传递问题,并且给出了阿里开源TTL框架和手写组件的方案。后来老吕还是觉得TTL的方案有点复杂,手写那个组件不够通用,所以就做了改进,使读写数据通用化。设计比较简单实用,一个类就搞定了,思路还是通过代理Runnable和Callable接口来增加数据中转的能力,我一直认为这个思路是最划算的。本次加强...
2022-05-23 20:24:43
567
原创 聊聊代码复用
大家好,我是老吕,今天聊聊代码复用。减少重复代码,对重复代码进行抽象、下沉,遵守设计原则,应用设计模式,都有一个共同的目的:发现变化,封装变化,提高代码的可复用性,减少需求变化影响的范围,使软件、系统、云服务、网站等能够可控的修改与升级,具有更长的生命周期。代码复用的级别或者复杂度级别1:复制粘帖如果只有一个地方用这段代码,也无可厚非,当有两个以上地方用的时候就需要考虑封...
2022-05-22 23:35:16
2443
1
原创 JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据
上一篇中老吕介绍了ThreadLocal线程数据绑定的原理,今天聊聊父子线程之间如何继承ThreadLocal上维护的数据。开发过程中异步执行任务有两种情况,第一种情况是 主线程 通过 new Thread()的方式产生了一个子线程,然后把 task 交给子线程去执行;第二种情况是主线程将task提交到线程池去执行。不同的情况需要不同的方...
2022-04-26 17:56:23
1867
1
原创 JDK源码系列:ThreadLocal实现原理
大家好,在软件开发过程中,一般情况下方法之间调用时都是通过接口参数来传递数据的,但有一些公共参数(userId、token、orgId、roleId等)的传递就不能那么干了,在Java中一般用ThreadLocal 去解决这个问题,今天老吕来分析下ThreadLocal的源码。一、ThreadLocal的本质通过共享内存来传递数据。但它是如何做到多线程安全...
2022-04-25 15:49:54
376
原创 JDK源码系列:AQS(队列同步器)原理
大家好,好久不见,今天看下JDK中的JUC包中AQS(AbstractQueuedSynchronizer 队列同步器)的实现原理。JUCL下的锁和synchronized提供的锁的区别1、锁的获取和释放是显示的靠程序员用代码来控制的,增加了灵活性,可以实现更加复杂的应用场景2、尝试非堵塞式的获取锁3、可中断的获取锁4、可超时的获取锁5、等待队列可按条件分...
2022-04-17 20:03:03
351
原创 JDK源码系列:synchronized与wait、notify、notifyAll
大家好,今天聊一聊synchronized与obj.wait()、obj.notify()、obj.notifyAll() 之间的关系以及它们的实现原理。我们今天采用边写demo边分析的方式来进行。案例1:public class SyncDemo { public synchronized int add(int a,int b){ ...
2022-03-28 13:59:15
392
原创 JDK源码系列:Future是如何实现的?
大家好,我们在异步编程时向线程池提交(submit)一个任务后会得到一个 Future对象,通过 future.get() 方法可以堵塞等待结果的完成,例如:public ...
2022-03-20 23:33:55
507
原创 手撕分表方案
目标解决业务数据库中只有少数几个表数据量特大的问题,大部分普通表在百万级别,有几张特别大的接近1亿条数据了。针对这种情况,虽然可以通过增加分库解决,只是库的数量增长会比较快。如果只针对大表...
2022-03-01 16:46:45
652
原创 代码精进之路-设计模式-UML图(行为型)
十三、责任链模式请求与处理中解耦,不需要关注处理者是谁,把请求扔到这个处理链上即可比较常用的设计模式,对后继者的管理可以通过一个简单的链表实现,也可以通过数组实现,tomcat中实现的过滤...
2022-02-23 13:20:17
380
原创 代码精进之路-设计模式-UML图(构建型和结构型)
一、抽象工厂模式用于相关的一系列产品的生产,这样不容易出错二、构建者模式用于复杂对象分步骤可定制化构建,更好的用户体验三、 工厂方法模式具体产品和具体工厂同时增加四、原型模式对象的克隆,不...
2022-02-23 11:01:43
427
原创 手撕读写分离
目标横向水平分库+读写分离方案方案选择老吕知道的方案有三种:1、在应用层通过AOP实现,有少许代码耦合,但是可控性高,灵活2、通过分库中间件代理实现3、通过云厂商一键实现(和2同属代理模式...
2022-02-19 21:20:18
453
原创 代码精进之路-设计模式-(三)行为型模式
三、行为模式(11个)1、责任链模式//保存凭证之前的规则检查public class Client { public static void main(String[] arg...
2022-02-15 07:48:04
259
原创 代码精进之路-设计模式-(二)结构型模式
二、结构型模式(7个)1、适配器模式//针对的是已经存在的组件或者系统,而你也有自己的接口规范,你不想去依赖对方的接口,//这时候用适配器模式比较合适,用自己接口的一个实现去依赖对方的接...
2022-02-14 11:10:40
304
原创 代码精进之路-设计模式-(一)创建型模式
一、创建型模式(5个)抽象工厂模式//用于一个系列或风格的产品生成public class Client { public static void main(String[]...
2022-02-13 23:30:22
346
原创 JDK中Timer定时器底层到底是怎么实现的?
关于定时器在JDK中提供了两种方式,一种是 Timer(同步调度) ,另一种是ScheduledThreadPoolExecutor(异步调度)。更高级的任务调度开源框架就比较多了,但最核...
2022-01-14 21:26:45
674
原创 Dubbo的日志体系是怎么实现的?
日志组件是每个应用系统必备的组件,日志组件有多种开源实现,不同的项目可能选择了不同的日志组件。有这么一个场景,你的应用系统中可能采用了多种开源框架或者组件或者SDK,如果这些第三方组件中强...
2022-01-05 20:45:20
2612
原创 代码精进之路-设计模式-组合模式
组合模式属于设计模式中的"结构型模式"。组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。你可以使用它将对象组合成树状结构...
2021-12-29 20:41:58
675
原创 代码精进之路-设计模式-拦截器链模式
上一讲中说了《Tomcat的过滤器链 是如何实现的》,今天来看下 Spring的拦截器链是如何实现的。从位置上来说 过滤器是属于Servlet容器级别的规范,拦截器是Spring自身的东西...
2021-12-27 16:59:03
630
原创 代码精进之路-设计模式-过滤器链模式
过滤器链设计模式Java Web应用开发中过滤器Filter都用过,今天老吕带大家来看看最常用的tomcat中是如何实现 Servlet规范中过滤器链功能的。源码讲解javax.servl...
2021-12-26 23:56:00
1316
原创 代码精进之路-迪米特法则(最少知道原则)
在上一讲中迪米特法则没有细讲,补充下。一、迪米特法则的定义1、最少知识原则迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Princi...
2021-12-12 23:49:25
660
原创 代码精进之路-设计原则
设计原则是前辈的总结,为后来人提供经验,写出更好的代码,降低系统复杂度,提高代码的稳定性,可维护性。有时候你觉得这个方案这样设计也可以,那样设计也没问题,犹豫不决,这时不妨参考下设计原则,...
2021-12-11 23:20:10
524
原创 老吕架构-2021年文章精选
从2021年2月份到12月份陆续发了40多篇文章,这也是我第1年写公众号,排版各方面都没有特意装修过,质量可能也参差不齐,但是基本上遵守了原创和实践的承诺,能带上代码的尽量带...
2021-12-09 10:32:58
141
原创 代码精进之路-函数
编写好函数是编写好代码的基础,一个系统容易腐化的部分正是函数。不解决函数的复杂性,就很难解决系统的复杂性。虽然函数不像面向对象技术那么复杂,但要写好函数也不是一键容易的事情。好的函数能大大...
2021-12-06 23:13:33
369
原创 代码精进之路-命名与规范
一、命名1、有意义的命名如果你无法想出一个合适的名字,很可能意味着代码“坏味道”、设计有问题。这时可以思考一下:是不是方法里实现了太多的功能?或者类的封装内聚性不够?2、函数名函数命名要具...
2021-12-05 22:26:00
476
原创 轻重接口隔离
名词约定1、轻重接口轻接口=轻量级接口,运行时间短,性能高,对服务器资源(内存、CPU、数据库)占用少;重接口=重量级接口,运行时间长,性能差,对服务器资源(内存、CPU、数据库)占用多;...
2021-11-22 20:38:01
508
原创 长事务监控
在上篇文章《长事务问题的解决》中提到了长事务的监控,完善的监控可以加快解决问题的效率。今天老吕来说一种可行的监控实现方案:基于Druid连接池的事务监控实现。步骤一、增加一个Druid过滤...
2021-11-10 18:18:13
1150
原创 长事务问题的解决
背景长事务在DB服务端的表现是session持续时间长,期间可能伴随cpu、内存升高,严重者可导致DB服务端整体响应缓慢,导致在线应用无法使用,所以在线高并发业务中应该尽量...
2021-11-05 14:41:31
6036
原创 Dubbo IO异常的捕获
需求为什么要写这么一个小问题呢,可能有同学说了,发生异常后不是自动就体现到日志里面去了吗?有啥可捕获的?想想这么一个场景:生产环境中众多日志中发现了如下异常信息:[New I/O work...
2021-11-01 11:56:42
427
原创 编程的逻辑-用面向对象方法实现复杂业务需求
虽然不少同学一直在使用面向对象的语言进行项目开发,但是在分析、设计和编码过程中不一定用是真正的OOA/OOD/OOP的思想,贫血模型由于快速高效易上手,使用的项目不在少数,...
2021-10-31 23:25:10
1220
gradle-5.6.4
2020-10-11
javafx_scenebuilder-2_0-macosx-universal.dmg.zip
2020-03-25
VisualVM_144.dmg.zip
2019-11-27
汇编语言 第三版 王爽 pdf + 课件ppt +习题答案
2017-11-16
项目管理师考试资料大全项目管理师.part1.rar.part5
2010-03-12
项目管理师考试资料大全项目管理师.part1.rar.part4
2010-03-12
项目管理师考试资料大全项目管理师.part1.rar.part1
2010-03-12
项目管理师考试资料大全项目管理师.part1.rar.part2
2010-03-12
项目管理师考试资料大全项目管理师.part1.rar.part1
2010-03-12
精通eclipse整合web开发struts hibernate spring jbpm 第18章源代码(source )
2010-03-01
精通eclipse整合web开发struts hibernate spring jbpm 第20章源代码(source sql)
2010-02-06
精通eclipse整合web开发struts hibernate spring jbpm 第20章源代码(部分)
2010-02-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人