Java
文章平均质量分 77
Java 后端实战专栏,记录 SpringBoot、MyBatis、数据库交互、异常处理、代码优化等开发干货。整合日常编码踩坑、线上故障排查、工具类最佳实践,全部为项目真实案例,持续更新可落地开发方案。
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-04 00:56:40 · 638 阅读 · 0 评论 -
Java对象头
在HotSpot虚拟机中,对象在堆内存的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)、和对齐填充(Paddin)。原创 2024-10-03 16:45:47 · 411 阅读 · 0 评论 -
CompletableFuture常用方法
CompletableFuture常用方法原创 2024-10-02 22:08:58 · 1404 阅读 · 0 评论 -
synchronized底层是怎么通过monitor进行加锁的?
synchronized底层是怎么通过monitor进行加锁的原创 2024-10-02 22:07:22 · 1168 阅读 · 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 评论 -
Minio实现分布式存储
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。MinIO是高性能对象存储,什么是对象存储(Object Storage Service),对象存储是支持海量用户远程访问的无限容量廉价存储系统,既然是存储系统。原创 2024-09-13 22:00:04 · 2125 阅读 · 0 评论 -
LockSupport详解
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语,其中park()和unpack()而作用分别是阻塞线程和解除阻塞线程。原创 2024-09-12 09:12:48 · 1185 阅读 · 0 评论 -
不能引入第3方组件,如何自研限流组件框架,赋能团队
不能引入第3方组件,如何自研限流组件框架,赋能团队原创 2024-09-03 21:52:18 · 1038 阅读 · 0 评论 -
IDEA如何使用通义灵码?
大家都眼红过vscode里的Copilot的一键生成注释功能,以及代码自动补全,但是每月30$的价格却让人望而却步,但是!就在上个月,阿里云发布了一款可以代替Copilot的通义灵码,并且是免费使用的!不是Copilot用不起,而是通义灵码更有性价比。原创 2023-12-05 21:27:13 · 18665 阅读 · 0 评论 -
IDEA的了解与使用
IDEA,是 JetBrains (https://www.jetbrains.com/)公司的产品,该公司成立于2000年,总部位于捷克的布拉格,致力于为开发者打造最高效智能的开发工具。WebStorm:用于开发 JavaScript、HTML5、CSS3 等前端技术PyCharm:用于开发 pythonPhpStorm:用于开发 PHPRubyMine:用于开发 Ruby/RailsAppCode:用于开发 Objective - C/SwiftCLion:用于开发 C/C++原创 2023-12-03 21:34:35 · 4598 阅读 · 1 评论 -
Java中main()方法详解
Java中main()方法详解原创 2023-12-02 15:00:38 · 941 阅读 · 1 评论 -
Java面试题-if-else
查看以下代码是否存在问题,为什么?原创 2023-11-30 18:07:09 · 654 阅读 · 0 评论 -
System中public static final InputStream in = null;声明的是final为何还有对应的setIn方法
在Java的System类中,有一个public static final修饰的InputStream对象,即这个对象被声明为final,意味着一旦被赋值,就不能再被修改。而声明的是final为何还有对应的setIn方法?System类中的final属性System类中的setIn()方法。原创 2023-11-29 11:50:42 · 844 阅读 · 1 评论 -
Java中自定义异常类以及对象流自定义类中为什么要声明一个全局常量?
Java中自定义异常类以及对象流自定义类中为什么要声明一个全局常量?原创 2023-11-28 09:53:21 · 1604 阅读 · 0 评论 -
Java字符编码和字符集
计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。编码:字符(人能看懂的文字) ---> 字节(计算机能看懂的二进制数据)解码:字节(计算机能看懂的二进制数据) ---> 字符(人能看懂的文字)提示:以下是本篇文章正文内容,下面案例可供参考。原创 2023-11-27 10:15:55 · 1525 阅读 · 0 评论
分享