其他
Java 并发编程时:编写线程安全…
适用于在 Java(含 Java 21+ 虚拟线程)中实现线程安全、并行处理、异步组合、线程池配置与并发问题排查。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Java 并发编程时:编写线程安全、并行通用
解决思路
- 配置技能参数:将 concurrency_model 设为 threads、executors、virtual_threads 或 reactive;将 java_version 设为所需版本,默认 "21"。
- 编写线程安全代码时,使用同步机制:synchronized、volatile、Lock 接口(如 ReentrantLock)、原子操作。
- 管理线程时,处理线程生命周期与状态、区分 daemon 与 user 线程、实现中断处理。
- 使用 Executors 时,配置 ThreadPoolExecutor;使用 ForkJoinPool;在 Java 21+ 使用 Virtual Threads。
- 使用 CompletableFuture 时,实现异步执行、链式组合(thenCompose/thenApply 等)和异常处理(exceptionally 等)。
- 快速使用虚拟线程执行器:用 try-with-resources 包裹 Executors.newVirtualThreadPerTaskExecutor(),用 executor.submit 提交任务,例如对 IntStream.range(0, 10_000) 提交 processRequest(i)。
- 组合 CompletableFuture:调用 fetchUser(id),用 thenCompose 串接 fetchOrders(user.id()),用 thenApply 串接 processOrders(orders),用 exceptionally(handleError) 处理异常,用 orTimeout(5, TimeUnit.SECONDS) 设置超时。
- 配置 ThreadPoolExecutor:corePoolSize=10、maximumPoolSize=50、keepAliveTime=60L、TimeUnit.SECONDS、new ArrayBlockingQueue<>(1000)、new ThreadPoolExecutor.CallerRunsPolicy()。
- 使用带超时的 ReentrantLock:调用 lock.tryLock(1, TimeUnit.SECONDS);获取锁后在 try 中执行 critical section,并在 finally 中 lock.unlock()。
- 计算 CPU-bound 线程池大小:使用 cores,例如 8 threads。
- 计算 I/O-bound 线程池大小:使用 cores * (1 + wait/compute),例如 80 threads。
- 排查死锁:若因循环锁导致,使用 Lock ordering 或 tryLock。
- 排查竞态条件:若因缺少同步导致,添加 locks/atomics。
- 排查线程饥饿:若因不公平调度导致,使用 fair locks。
- 生成线程转储:运行 jstack -l <pid> > threaddump.txt。
- 打印线程信息:运行 jcmd <pid> Thread.print。
- 调用技能:Skill("java-concurrency")。
适用边界 · 注意事项
- 非 Java 项目或不需要并发/异步的简单顺序逻辑。
- 需要 Reactor/RxJava 等响应式流具体实现时,本技能未覆盖 reactive 实现。
- Java 版本低于 21 时,不能直接使用虚拟线程(Virtual Threads)。