java教程技术文章
-
Java Record 的 final 组件不等于集合不可变。本文用 ArrayList、unmodifiableList 和 List.copyOf 对比可变、只读视图与防御性拷贝,帮助排查 Record 中集合被外部修改的问题。359 收藏 -
Java 模块系统中,exports 解决模块间公开类型的普通访问,opens 解决运行时深反射。本文用 module-info.java 和命令行参数对比两者边界,并说明如何用 to 限定目标模块。496 收藏 -
讲清 Java HttpClient WebSocket 的 Listener 回调、request(1) 背压、文本分片与 sendClose、abort 关闭顺序,并给出可落地的异步监听器写法。315 收藏 -
Java Pattern 使用命名捕获组读取可选字段时,要区分分支未参与匹配产生的 null 与匹配空文本产生的空字符串,并在解析边界统一处理默认值和异常。209 收藏 -
Java NIO WatchService 默认只监听已经注册的目录。本文用递归注册、动态补注册和 WatchKey 映射解决子目录事件遗漏。338 收藏 -
Java Files.lines 返回的是持有文件资源的惰性 Stream,必须在 try-with-resources 中关闭;本文说明文件句柄为何持续占用、正确写法以及与 readAllLines、BufferedReader 的选择边界。248 收藏 -
Java ExecutorService 关闭时,先用 shutdown 拒绝新任务,再用 awaitTermination 等待;超时后以 shutdownNow 兜底,并正确处理中断和未启动任务。136 收藏 -
CompletableFuture.allOf 返回的是 CompletableFuture,它只负责等待全部任务完成。保留每个子任务的 CompletableFuture,再逐项 join,就能按原顺序收集类型安全的返回值。 437 收藏 -
Java record 的字段是 final,但组件对象未必不可变。把带 List 等可变组件的 record 当作 HashMap 键时,组件内容变化会让 hashCode 改变,导致 get 或 containsKey 定位失效。128 收藏 -
Java Stream 使用 groupingBy 分组时,默认结果 Map 的键顺序不能作为业务依据。通过 groupingBy 的 mapFactory 传入 LinkedHashMap::new,可以让分组键按首次出现顺序迭代,同时在有序输入和 toList 下保留每组元素顺序。本文还说明并行流、TreeMap 与排序的选择边界。498 收藏 -
Java JFR 可以用 jdk.MethodTiming 或 jdk.MethodTrace 配合 filter,只记录指定类或方法的执行事件;本文比较两种事件,给出 java 与 jcmd 的短窗口配置,并说明 threshold、stackTrace 和 ExecutionSample 的边界。139 收藏 -
Java 25+ 中用 ScopedValue 传递只读请求上下文,重点比较它与 ThreadLocal 的生命周期、可见性、嵌套绑定和结构化子任务继承边界。364 收藏 -
Java 虚拟线程进入 synchronized 并不等于一定发生 pinning。本文按 JDK 版本、JFR 事件和 tracePinnedThreads 堆栈,说明如何确认载体线程是否被占住,以及什么时候该换成 ReentrantLock。163 收藏 -
Java JFR 降低诊断开销的关键不是关闭记录,而是先选对配置,再按事件设置 period、threshold 和 stackTrace,最后检查 JFR 文件是否包含足够证据。129 收藏 -
文章 · java教程 | 1个月前 | 故障排查 · Java教程 · java SPI ServiceLoader ClassLoader module-info.java META-INF/services
Java ServiceLoader 找不到实现类时,优先检查 META-INF/services 文件是否进入 JAR、实现类全限定名是否正确,以及模块化项目的 uses/provides 声明。本文按 JAR、模块、ClassLoader 和初始化边界给出一套可执行排查清单。490 收藏