-
Java ExecutorService 关闭时,先用 shutdown 拒绝新任务,再用 awaitTermination 等待;超时后以 shutdownNow 兜底,并正确处理中断和未启动任务。
-
CompletableFuture.allOf 返回的是 CompletableFuture,它只负责等待全部任务完成。保留每个子任务的 CompletableFuture,再逐项 join,就能按原顺序收集类型安全的返回值。
-
Java record 的字段是 final,但组件对象未必不可变。把带 List 等可变组件的 record 当作 HashMap 键时,组件内容变化会让 hashCode 改变,导致 get 或 containsKey 定位失效。
-
Java Stream 使用 groupingBy 分组时,默认结果 Map 的键顺序不能作为业务依据。通过 groupingBy 的 mapFactory 传入 LinkedHashMap::new,可以让分组键按首次出现顺序迭代,同时在有序输入和 toList 下保留每组元素顺序。本文还说明并行流、TreeMap 与排序的选择边界。
-
Java JFR 可以用 jdk.MethodTiming 或 jdk.MethodTrace 配合 filter,只记录指定类或方法的执行事件;本文比较两种事件,给出 java 与 jcmd 的短窗口配置,并说明 threshold、stackTrace 和 ExecutionSample 的边界。
-
Java 25+ 中用 ScopedValue 传递只读请求上下文,重点比较它与 ThreadLocal 的生命周期、可见性、嵌套绑定和结构化子任务继承边界。
-
Java 虚拟线程进入 synchronized 并不等于一定发生 pinning。本文按 JDK 版本、JFR 事件和 tracePinnedThreads 堆栈,说明如何确认载体线程是否被占住,以及什么时候该换成 ReentrantLock。
-
Java JFR 降低诊断开销的关键不是关闭记录,而是先选对配置,再按事件设置 period、threshold 和 stackTrace,最后检查 JFR 文件是否包含足够证据。
-
Java ServiceLoader 找不到实现类时,优先检查 META-INF/services 文件是否进入 JAR、实现类全限定名是否正确,以及模块化项目的 uses/provides 声明。本文按 JAR、模块、ClassLoader 和初始化边界给出一套可执行排查清单。
-
Java HttpClient 的 BodyHandlers.ofInputStream 适合边收边处理的大响应,但调用方必须消费或关闭返回的 InputStream。本文对比 ofString、ofByteArray、ofFile 和 ofInputStream,给出状态码判断、流复制与资源清理的安全写法。
-
Java Record 的参数校验应集中放在规范构造器中:用 compact constructor 处理清洗、非空、格式和范围约束,重载构造器统一委托,避免对象从旁路入口创建。
-
解释 Java Pattern.DOTALL 为什么让点号匹配换行,区分 DOTALL、MULTILINE 与 UNIX_LINES 的作用,并用 Java 示例说明如何限定跨行匹配范围、避免贪婪量词吞掉后续内容。
-
Java NIO FileChannel 共享 position 时,多个线程先定位再写入可能互相覆盖。本文用显式位置写入、区间分配和应用层锁,说明并发读写的安全边界。
-
Java Path.normalize() 只整理 . 和 .. 等冗余名称,不检查文件是否存在;toRealPath() 会访问文件系统并返回已存在目标的绝对真实路径。本文用符号链接和选择清单说明两者边界。
-
已知 HashMap 的预计映射数时,不要直接把条目数当初始容量;本文用默认负载因子 0.75 说明估算公式、JDK 19+ 的 newHashMap 和容量过大的代价。