plugins/languages/java/skills/concurrency/SKILL.md
Java 并发编程规范 — Virtual Threads (JEP 444)、Structured Concurrency (JEP 505)、Scoped Values (JEP 506)、CompletableFuture、java.util.concurrent 工具类、锁策略。当用户编写多线程、异步、并行代码,或讨论 "Virtual Threads"、"虚拟线程"、"并发"、"线程池"、"死锁"、"竞争条件"、"ThreadLocal"、"CompletableFuture"、"async"、"协程" 时加载。
npx skillsauth add lazygophers/ccplugin java-concurrencyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
适用 Java 21+ (Virtual Threads GA) / Java 25 (Structured Concurrency + Scoped Values GA)。
ReentrantLock 或并发集合ScopedValueCompletableFuture / CountDownLatch / Phasernew Thread().start();用 Executors 或 Thread.ofVirtual()orTimeout / completeOnTimeout)ConcurrentHashMap / CopyOnWriteArrayList,禁 Collections.synchronizedXxx// 推荐:每任务一虚拟线程 executor
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
List<Future<String>> results = urls.stream()
.map(url -> executor.submit(() -> http.get(url)))
.toList();
for (var f : results) handle(f.get());
}
// 工厂方式
Thread.ofVirtual().name("worker-", 0).start(() -> task());
// Spring Boot 3.2+ 启用 (application.yml)
// spring.threads.virtual.enabled: true
适用边界:
// 反例:synchronized 会 pin 虚拟线程
synchronized (lock) { db.query(); }
// 正例:ReentrantLock 不 pin
private final ReentrantLock lock = new ReentrantLock();
lock.lock();
try { db.query(); } finally { lock.unlock(); }
// ShutdownOnFailure:任一失败即取消全部
try (var scope = StructuredTaskScope.open(
StructuredTaskScope.Joiner.<Object>awaitAllSuccessfulOrThrow())) {
var userTask = scope.fork(() -> fetchUser(id));
var ordersTask = scope.fork(() -> fetchOrders(id));
scope.join();
return new Profile(userTask.get(), ordersTask.get());
}
// ShutdownOnSuccess:首个成功即返回
try (var scope = StructuredTaskScope.open(
StructuredTaskScope.Joiner.<String>anySuccessfulResultOrThrow())) {
scope.fork(() -> queryPrimary());
scope.fork(() -> queryReplica());
return scope.join();
}
注:Java 21-24 期间为 incubator,API 经多次重构;Java 25 正式 API 以 Joiner 工厂方法呈现。
private static final ScopedValue<UserContext> USER = ScopedValue.newInstance();
// 绑定 + 运行
ScopedValue.where(USER, currentUser).run(this::handleRequest);
// 读取(仅作用域内可见)
UserContext u = USER.get();
优势:不可变、按作用域出栈自动清理、虚拟线程友好、无内存泄漏风险。
CompletableFuture<User> userF = CompletableFuture.supplyAsync(() -> svc.user(id));
CompletableFuture<List<Order>> ordersF = CompletableFuture.supplyAsync(() -> svc.orders(id));
CompletableFuture<Profile> profile = userF
.thenCombine(ordersF, Profile::new)
.orTimeout(5, TimeUnit.SECONDS)
.exceptionally(ex -> { log.error("profile fail", ex); return Profile.empty(); });
| 场景 | 工具 |
|------|------|
| 线程安全 Map | ConcurrentHashMap + computeIfAbsent |
| 原子引用 | AtomicReference.updateAndGet |
| 等多任务完成 | CountDownLatch 或 Structured Concurrency |
| 限流 | Semaphore |
| 周期任务 | ScheduledExecutorService (禁 Thread.sleep 循环) |
| 生产-消费 | BlockingQueue (LinkedBlockingQueue / ArrayBlockingQueue) |
| AI 易犯解释 | 实际应核验 | |---------|---------| | "传统线程池就够" | I/O 任务是否上 Virtual Threads? | | "synchronized 简单" | 是否会 pin 虚拟线程?换 ReentrantLock | | "ThreadLocal 很方便" | 是否考虑 ScopedValue? | | "fork 就完事" | 是否用 StructuredTaskScope 防泄漏? | | "future 永远 wait" | 是否设 orTimeout? | | "Thread.sleep 等等" | 是否 ScheduledExecutorService? |
orTimeoutspring.threads.virtual.enabled=truejdk.VirtualThreadPinned)tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。