-
Java 完成队列会把已完成的 Future 放入队列,适合从多个并发任务中按完成先后消费结果。本文用一个最快结果优先的查询场景,比较 take 与 poll 的边界,并说明超时后如何取消剩余任务和安全关闭线程池。
-
Java NIO 中 ByteBuffer.flip() 会把当前 position 变成 limit,再把 position 归零,适合把写入态切换为读取态。本文用状态表、代码和边界示意说明 flip 怎么配置,以及如何排查读不到数据、下溢和多轮读写问题。
-
Java 16 起 Stream.toList() 进入生态,但迁移到 Java 21 时要处理空结果、并行行为和序列化返回类型差异,避免线上行为回归。
-
从一个有界缓冲区的生产消费场景出发,说明 ReentrantLock 条件队列中 await、signal、signalAll 的配合方式,以及如何用队列状态和中断测试确认没有丢通知。
-
Java 虚拟线程可以承载大量并发任务,但外部服务仍有容量上限。本文用 Semaphore 只限制下游调用区,并说明中断、等待超时、finally 释放以及连接池重复限流的边界。
-
Pattern.asMatchPredicate 能把已编译正则直接变成 Predicate,适合复用在 Stream.filter 和输入校验中。本文拆开 matches 的完整匹配语义、find 的差异与重复编译成本。
-
用一个可运行的小例子拆开 Java Map.computeIfAbsent 的 null 语义、递归更新限制和 ConcurrentHashMap 并发边界,避免把缓存未命中误判成已写入。
-
Java Stream.toList() 与 Collectors.toList() 都能把流收集成 List,但返回列表的可变性、null 边界和类型推断并不相同。本文用可运行示例说明如何按后续操作选择写法。
-
TCP和UDP都能完成两台计算机之间的数据通信,而且通信双方同样都需要创建Socket对象。不过,二者在通信方式上有一个很关键的区别。UDP只有发送端和接收端之分,并不强调客户端或服务器端的角色,设备之间可以比较自由地互相发送数据;TCP则不同,它对客户端和服务器端有明确区分,通信建立时,必须先由客
-
Java virtual thread 遇到 synchronized 后,锁等待、carrier 固定和平台线程阻塞很容易混为一谈。本文按 JDK 版本、JFR 事件和实际阻塞类型给出排查与修复路径。
-
Java BigDecimal 的 2.0 与 2.00 数值相同但 equals 返回 false,是因为 equals 同时比较数值和 scale。本文用代码说明 compareTo、setScale、stripTrailingZeros 与集合键的选择边界。
-
Java ServiceLoader 在模块路径下找不到 provider,通常不是接口实现消失,而是 uses、provides、模块路径或 provider 实例化条件没有同时满足。本文用最小模块示例拆开排查。
-
在 Ja va 里,任何对象都有自己的生命周期,线程当然也一样。从 Thread 对象创建完成的那一刻起,这条线程的生命周期就算正式开启了;而当线程任务中的代码正常执行结束,或者在线程运行过程中抛出了未被捕获的异常(Exception)或错误(Error)时,它的生命周期也就随之走到了终点。 在 J
-
JComboBox组件被称为下拉框或者组合框,它将所有选项折叠在一起,默认显示的是第一个添加的选项。当用户单击下拉框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。 JComboBox 这种下拉框组件,常见的就两种形态:一种是不可编辑,用户只能从已有选项里挑;另一种是可编辑,除了能选现成
-
用一个只允许从 0 变为 1 的状态位,拆开 Java VarHandle compareAndExchangeAcquire 的 witness 返回值、acquire 读取语义、失败分支和可验证测试。