-
BLOCKED线程从未获取锁,WAITING线程一定曾持有锁;jstack中“waitingtolock”表未抢到,“waitingon”表已持有并让出;sleep不释放锁且非WAITING,wait必须在synchronized内调用;BLOCKED自动参与锁竞争,WAITING必须显式唤醒。
-
ReentrantReadWriteLock适用于读远多于写的场景,通过读并行、写独占提升缓存类数据结构并发性能;需遵循双重检查、写锁降级及锁粒度分片等规范,读写比建议≥20:1。
-
LambdaConversionException是JVM运行时Lambda转换失败抛出的RuntimeException,表明方法签名不匹配、目标不可见或字节码元信息损坏,非业务异常,需检查MethodType、可见性及构建工具链。
-
Java8中用Stream和Lambda实现笛卡尔积的核心是flatMap+map嵌套:外层流遍历第一个集合,对每个元素用flatMap拉平第二个集合的映射结果,并在map中构造数组、List或DTO;支持任意类型、多集合及自定义对象,需注意空集合、基本类型流转换和内存溢出风险。
-
DCL单例易出错主因是未用volatile导致指令重排序,使线程看到未初始化完成的对象;必须用volatile修饰instance、双重检查、锁类对象,缺一不可。
-
System.console()在IDE中返回null是因缺乏底层TTY支持,仅在系统终端运行jar时有效;readPassword()返回char[]为安全设计,需手动清零;Windows中文路径会导致编码问题;多环境部署应放弃该API,改用适配方案。
-
Proxy.getProxyClass()仅生成代理类,不检查是否已被代理;判断对象是否为代理实例应使用Proxy.isProxyClass()和Proxy.getInvocationHandler()。
-
高并发下应避免synchronized全局锁,因其导致请求串行化、吞吐量骤降,并易引发线程饥饿或死锁;优先使用AtomicInteger、ReentrantLock(带超时)、ConcurrentHashMap等并发工具。
-
CallerRunsPolicy的核心价值是作为压力调节阀,通过调用者线程同步执行任务实现反压降级;适用于不能丢任务、可容忍短时延迟、上游线程可控的场景,需配合有界队列、合理线程数及短耗时任务(≤200ms)使用。
-
使用volatile标志和中断机制可实现Java线程安全取消,通过定期检查状态或捕获InterruptedException响应取消信号,结合Future.cancel(true)统一管理任务生命周期,并在finally块中清理资源,确保无泄漏。
-
printStackTrace()可快速输出完整堆栈到System.err,适用于开发调试;需判空避免NPE;获取字符串应使用StringWriter+PrintWriter;日志中须传Throwable实例而非字符串拼接。
-
非公平锁性能更高,因其在lock()中优先执行compareAndSetState(0,1)直接抢锁,跳过AQS队列操作;而公平锁需先调用hasQueuedPredecessors()检查队列头部,引发内存屏障和缓存同步开销,导致吞吐下降。
-
关键在于匹配任务特性做轻量调度:纯计算型设CPU核数+1;含IO型按公式CPU×(1+IO等待/CPU计算)估算;用有界队列+CallerRunsPolicy反压;剥离阻塞点并强制超时;动态扩缩容适配流量。
-
Double.compare()是处理double排序的推荐方式,它天然支持NaN、正无穷和负无穷,保证排序行为一致可预测,避免了直接使用==或<等运算符导致的异常。
-
BlockingQueue是Java中实现生产者消费者模式的线程安全工具,位于java.util.concurrent包下,通过put()和take()方法实现阻塞操作,当队列满时生产者阻塞,空时消费者阻塞,无需手动同步;其常用实现有ArrayBlockingQueue(有界数组队列)、LinkedBlockingQueue(可选有界链表队列)和SynchronousQueue(不存储元素的同步队列);示例代码展示使用ArrayBlockingQueue进行生产和消费,生产者每500毫秒发送消息,消费者每