- 博客(13)
- 收藏
- 关注
原创 线程池ThreadPoolExecutor原理解析与源码阅读
本文重点介绍线程池的执行原理,相信大部分人都不了解线程池如何新增线程、如何维护核心线程不被回收、如何使非核心线程在一定时间后被回收。
2025-02-13 20:45:12
968
原创 FutureTask源码深度解析
写在前面:阅读本文前必须对Java多线程知识有所了解。本文将深度解析FutureTask的源码,包括其怎么执行、怎么使调用get的线程阻塞、怎么解除这些线程阻塞、怎么取消以及中断。建议将这个类作为学习多线程的第一站,还是能学到不少东西的。
2025-01-15 21:01:04
807
1
原创 redis IO多路复用学习笔记
(如果不使用IO多路复用,一个线程往往需要阻塞式等待IO事件,即使使用非阻塞式IO,也难以监听多个FD,需要不断轮训各个FD,增加了线程的负载和开销。而且Redis6.0引入了I/O线程,用于处理网络请求的读写操作,不过所有的命令执行和数据操作仍在主线程中进行。多路复用允许单线程监听所有的FD,但不代表不可以使用多线程,Java的主从Reactor模型就是通过mainReactor进行连接的建立,通过subReactor线程池进行读写。:多线程或多进程模型需要频繁的上下文切换,这会带来额外的开销。
2025-01-14 17:06:53
286
原创 ThreadLocal原理解析与源码深度阅读
本文将讲解1.ThreadLocal内部结构,与ThreadLocalMap、Thread之间的关系 2.ThreadLocalMap的Entry为什么key为弱引用,value为强引用 3.ThreadLocal采取了哪些措施避免内存泄漏 4.详细的带注释的源码阅读如果key为强引用,则Entry对象永远对ThreadLocal对象有一个强引用,ThreadLocal对象将不会被清理,即使项目中已经无变量引用这个ThreadLocal对象。
2025-01-03 18:33:15
774
3
原创 ThreadLocal的介绍与使用规范,初学者必看
很多人刚学ThreadLocal时,都以为它本身是一个存值的容器,这是一个很致命的误解,如果你这么认为,那你永远也用不好它。我们平时为了说话方便,都说把xxx存在ThreadLocal中,这其实是一个逻辑存,并不是真的存在这个对象里。第一个要注意的点是,ThreadLocal应该尽可能在流量的入口set,例如springboot的拦截器、过滤器、AOP中以及系统的门面方法中。因为这样,才能确保在执行完逻辑后,在finally中remove。
2024-12-29 21:43:14
746
3
原创 校招入职第一年——我的2024年终总结
第二个,由于对比了大量的代码,我对于阿里的Java编码规范有个更深刻的理解,并摸索出了一些编码规范,特别是异常处理规范与日志的打印规范,并且理解了写出整洁代码的必要性(真有人把全部逻辑写在同一个方法里,几百行)。最废人心神的事情其实是维护系统,每次一遇到客诉或bug,都得花大量的时间排查处理,这种情况不知道什么时候就来一次,最怕项目工期急的时候,还要查别的系统的问题。我觉得很对,不管项目再急,也不管合作的人写的再烂,也要写出自己最好的代码,说不定同事看到你写的好,自己也不好意思写的太随便了呢。
2024-12-29 16:04:37
288
原创 【学习笔记】java逃逸分析
是一种有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。能够分析出一个新的对象的引用范围从而决定是否要将这个对象分配到堆上。
2023-08-10 23:58:37
184
1
原创 普通内部类和静态内部类的区别
一个普通内部类不能脱离外部类实体被创建,且可以访问外部类的数据和方法,因为他就在外部类里面。即普通内部类需要外部类的对象创建outer.new Inner()。静态内部类可以直接new Outer.Inner()创建。普通内部类持有对外部类的引用,静态内部类没有持有外部类的引用。(普通内部类引用外部类,会导致不会被垃圾回收,内存泄漏)普通内部类能够访问外部类的静态和非静态成员,静态内部类只能访问外部类的静态成员。反编译后,可以看到普通内部类有外部类引用。静态内部类即加上static的内部类。
2023-08-10 23:06:24
80
1
原创 使用redis缓存的注意点
布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。标记一个数据时,使用n个哈希函数对其取哈希,然后用数组的长度取余。将数组中对应的下标置为1。当然,可能有哈希冲突的情况。但影响不大。因为查询布隆过滤器说数据存在,并不一定证明数据库中存在这个数据,但是查询到数据不存在,数据库中。
2023-08-06 15:43:38
261
原创 Redis学习笔记
Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。
2023-08-04 14:57:57
60
1
原创 redis缓存更新策略
这种方案可以不在业务中关心缓存处理,而是直接订阅mysql的binlog日志,发现有数据更新,就删除对应缓存。为了解决这两种方案的缺陷,可以使用延迟双删,即先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。不过有一种少见的极端情况,即缓存到期,读请求先来然后延迟,导致写入旧数据。第2种的缺陷:从更新数据库到删缓存的时间内,查询到的缓存为旧数据,也就是造成查询延迟。第1种的缺陷:删了缓存,另一个请求来查,发现缓存为空,查到旧数据保存到缓存中。可以将删除失败的缓存发到mq,由消费者进行重试。
2023-07-31 10:47:58
149
1
原创 【学习笔记】spring循环依赖
在 initializeBean 方法执行完成之后,AService 会继续去检查最终的 Bean 是不是还是一开始的 Bean,如果不是(变成了代理类),就去检查初始 Bean 有没有被其他 Bean 引用过,如果被引用过,就会抛出来异常,也就是上图大家看到的异常信息。即去三级缓存中取出beanFactory并执行这里的 getObject 方法,这个方法在执行的过程中,会去判断是否需要生成一个代理对象,如果需要就生成代理对象返回,如果不需要生成代理对象,则将原始对象返回即可。
2023-07-19 17:52:33
108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人