开发那点事
文章平均质量分 76
聚焦日常编码实战,记录各类开发场景遇到的疑难问题,附上完整落地解决方案,沉淀一线业务踩坑经验。
Leighteen
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ThreadLocal 内存泄漏:`Entry` 的 key 都用弱引用了,为什么还会泄漏
`ThreadLocal` 是个好东西:给每个线程一份独立的变量副本,天然线程隔离,常用来存用户上下文、事务、`SimpleDateFormat` 这类"每线程一份"的东西。但它有个著名的坑:**用不好会内存泄漏。** 更让人困惑的是,很多人知道"`ThreadLocalMap` 的 `Entry` 用了弱引用来防泄漏",于是产生一个疑问——**既然都用弱引用了,为什么还会泄漏?**原创 2026-08-05 16:46:04 · 413 阅读 · 0 评论 -
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
- `try` 里的 `return` 会**先把返回值暂存**,再执行 `finally`,最后返回**暂存的值**——所以 `finally` 改局部变量,改不动已经暂存的返回值。- `finally` 里如果有 `return` 或 `throw`,会**截胡**:覆盖 `try` 的返回值、并**吞掉 `try` 中正在传播的异常**——这是异常凭空消失的元凶。- 正解:**`finally` 只做清理,不写 `return`、不抛异常、不改返回变量**;关资源优先用 `try-with-res原创 2026-07-30 14:05:37 · 331 阅读 · 0 评论 -
DCL 单例为何要 `volatile`:一次半初始化对象引发的血案
双重检查锁定(DCL)是经典的单例实现方式,但若省略 volatile 修饰符,可能在高并发下返回未构造完的“半初始化对象”。问题的根源在于 new Singleton() 并非原子操作,实际分为分配内存、初始化对象、引用赋值三步。指令重排可能导致引用赋值先于对象初始化,此时其他线程绕过锁检查直接读取到未初始化的实例。原创 2026-07-30 12:00:10 · 512 阅读 · 0 评论 -
`==`、`equals` 和 Integer 缓存:为什么 `128 == 128` 是 false
文章摘要:Java中Integer类型比较的反直觉现象源于==与equals的差异及IntegerCache机制。==比较对象地址,equals比较值。Integer.valueOf()对-128~127范围内的数值返回缓存对象,导致127 == 127为true,而128 == 128因超出范围返回新对象为false。正确做法是包装类比较一律用equals,避免数值大小影响结果。同类陷阱存在于Long等包装类中,基本类型比较不受影响。原创 2026-07-27 15:12:07 · 365 阅读 · 0 评论 -
`volatile` 到底保证了什么:可见性、有序性,和它管不到的原子性
有个 bug 特别典型:一个线程把开关 `flag` 改成了 `true`,另一个线程里 `while (!flag)` 的循环却像有没听见一样,一直转个不停,就是不退出。把 `flag` 加上 `volatile`,问题立刻消失。于是很多人得出一个模糊的结论:"`volatile` 就是个轻量级的 `synchronized`,加上就线程安全了。"这个理解害人不浅。因为紧接着他们会写出 `volatile int count; count++;` 这种代码,然后在多线程下发现 `count` 的最终原创 2026-07-27 15:04:58 · 739 阅读 · 0 评论 -
@Async 异步任务的五个坑
本文深入剖析了Spring中@Async异步任务注解的五个常见陷阱,通过可运行的demo和真实日志展示了问题现象与解决方案。原创 2026-07-12 22:25:07 · 246 阅读 · 0 评论 -
当 @Transactional 不再可靠:批量任务中的编程式事务实践
`@Transactional` 是 Spring 里最常用的注解之一:方法上一挂,事务就有了,简单到几乎不用思考。但它的"简单"是有前提的——一旦脱离了"外部调用一个 public 方法、异常自然向上抛"这个理想模型,它就可能悄悄失效,而且**不报错、不提示**,只在数据里留下一堆对不上的脏记录。原创 2026-07-11 21:58:50 · 313 阅读 · 0 评论 -
线程池与分治合并:批量文档导出的性能优化实践
批量导出是后台系统里非常常见的功能:把成百上千条记录渲染成文档,合并成一个大文件,最终提供下载。功能实现起来不难,但一旦数据量上来,很容易慢到用户无法接受。本文以一个真实的优化过程为背景(一次批量文档合并从14 分钟优化到 1.5 分钟线程池在 IO 密集型任务中的应用,以及分治合并(Divide and Conquer)思想在文档拼接中的落地。全文不涉及具体业务,只讲这两个思路本身。批量任务的性能优化,本质是识别出"重复的、可并行的、代价被放大的"操作,然后用合适的手段拆解。原创 2026-07-09 11:15:00 · 488 阅读 · 0 评论 -
SPI机制
SPI(Service Provider Interface)机制是一种服务发现机制,广泛用于Java生态中。它允许框架或库通过接口解耦具体实现,用户可以在运行时动态地提供接口的实现,而不是在编译时确定。这种机制在很多场景下非常有用,比如数据库驱动、日志框架、解析库等。接口定义SPI机制为Java生态中的扩展和插件提供了标准的方式,尤其是在跨多个库或框架中非常有用。通过和的配置,Java程序可以在运行时动态加载实现类,从而实现高扩展性和解耦。原创 2024-10-13 19:42:33 · 2055 阅读 · 1 评论 -
后端参数校验方式
后端参数校验方式原创 2024-10-13 19:39:20 · 854 阅读 · 0 评论 -
细说“死锁“
死锁是指两个或两个以上的线程在执行过程中,因抢夺资源而造成的一种互相等待的现象,若无外力干涉,则它们无法再继续推进下去。原创 2024-10-04 00:56:40 · 638 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore
JUC包下三大辅助类:CountDownLatch、CyclicBarrier、Semaphore原创 2024-10-01 23:41:35 · 502 阅读 · 0 评论 -
ThreadLocal内存泄漏分析
1、内存泄漏原因:我们使用ThreadLocal过程中,如果ThreadLocal对象强引用断掉后,只剩弱引用,ThreadLocal对象会被回收,此时ThreadLocal中的key会变为null,而value没有被回收,同时又由于ThreadLocalMap是Thread中的成员属性,与Thread对象的生命周期是一样长,如果当前线程一直未被销毁,又没有手动删除对应key,这样就会导致value内存泄漏。原创 2024-10-01 23:23:27 · 2055 阅读 · 0 评论 -
Java8四大函数接口
Java8四大函数接口的说明与使用详情原创 2024-09-20 09:34:50 · 770 阅读 · 0 评论 -
如何在微服务的日志中记录每个接口URL、状态码和耗时信息?
如何在微服务的日志中记录每个接口URL、状态码和耗时信息?原创 2024-09-18 09:21:23 · 649 阅读 · 0 评论 -
IDEA-调用Restful接口
告别Swagger3/Apifox/Postman原创 2024-09-15 09:23:24 · 1227 阅读 · 0 评论 -
Docker常用命令
Docker 是一个开源的应用容器引擎,是一款快速构建、运行、管理应用的工具。容器完全使用沙盒机制,互相之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖任何语言、框架或包装系统。优点:Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用;镜像:将应用所需要的函数库、依赖、配置等与应用一起打包得到的就是镜像。容器:根据镜像的应用进程创建的隔离环境就是容器。镜像仓库:存储和管理镜像的服务就是镜像仓库。原创 2024-09-15 08:35:20 · 2970 阅读 · 0 评论 -
Minio实现分布式存储
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。MinIO是高性能对象存储,什么是对象存储(Object Storage Service),对象存储是支持海量用户远程访问的无限容量廉价存储系统,既然是存储系统。原创 2024-09-13 22:00:04 · 2125 阅读 · 0 评论 -
输入多次密码后如何限制用户规定时间内禁止再次登录
类似的问题:用户输入三次密码错误之后,如何限制用户十分钟内禁止登录?首先我们要明确的就是在多次输错密码之后限制的是用户还是IP。一般情况下建议使用IP地址为单位来进行限制,而非具体的用户,这样可以避免影响到真实用户的使用,减少误伤其他用户的可能性。例如,一个非法用户拿着别人的账户不断尝试,或者其他用户在输错账户的情况下,不断尝试错误密码,如果直接将其限制登录了,那么账户本人也就无法登录自己的账户了。因此,以IP地址为单位来限制相对更加合理。原创 2024-09-13 12:12:53 · 1829 阅读 · 0 评论 -
不能引入第3方组件,如何自研限流组件框架,赋能团队
不能引入第3方组件,如何自研限流组件框架,赋能团队原创 2024-09-03 21:52:18 · 1038 阅读 · 0 评论 -
误开启win11的HDR后,显示器不接受到任何信号
在win11系统下误开启hdr后电脑黑屏无法显示,但是副屏幕能正常显示,发现是开启hdr后导致电脑核显不工作,主屏只有在显卡跑起来的时候才会工作(连接副屏),国内全网查找无果后在微软社区论坛中找到遇到同样问题的帖子,并在回复内容中找到解决方案。原创 2024-09-03 21:49:59 · 6303 阅读 · 0 评论 -
Arrays.asList()把数组装换成集合的大坑!!!
那如果我们使用了Arrays.asList非要使用集合的操作方法呢,有什么办法能够避免吗,当然有,而且非常简单,我们只需要在外面再包一层真正的ArrayList就可以了,代码如下,运行起来也能够看到,如我们所预料的执行了代码。原创 2024-08-08 09:47:56 · 301 阅读 · 0 评论
分享