Oracle 架构师在讲 Project Loom 的结构化并发设计,核心思路很朴素:把一组有关联的任务视为一个工作单元,一起开始、一起结束。
先讲它解决什么问题
现在写并发,常见写法是起三个线程分别查三个服务,然后 join。问题是:如果第二个失败了,第一个还在跑,白烧资源;如果主线程被中断,子线程没人管,泄漏。
这种「父子任务的生命周期脱钩」是并发 bug 的主要来源。
结构化并发怎么改
子任务在父任务的作用域内启动,父任务不会在子任务结束前退出。任何一个子任务失败,整个作用域取消,其余子任务收到中断信号。
异常传播也变简单了:子任务的异常聚合到作用域,父任务一次处理,不用为每个 future 写 try-catch。
和虚拟线程的关系
虚拟线程解决的是「线程太贵、不敢多开」;结构化并发解决的是「开了之后怎么管」。两者配合,才能写出既高并发又不会泄漏的代码。
实践上的变化
一,别再手写线程池管理业务任务的生死了,用作用域包起来。
二,超时设置从「每个调用设一个」变成「整个作用域设一个」,语义更符合业务:用户等三秒,不是每个下游各等三秒。
三,取消要可响应。阻塞调用必须能响应中断,否则取消只是标记,实际还在跑。
迁移建议
先在新代码里用,别急着改存量。存量代码往往依赖隐式的线程生命周期,一次性改风险大。观察一个版本周期再扩面。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。