生产环境LocalDate.parse调用时线程卡在HashMap.put的问题咨询
问题可能的触发原因
- 多线程并发修改
HashMap触发扩容死循环
这是与栈特征完全匹配的最高概率根因:Java 8及更早版本的HashMap未做线程安全防护,多线程同时执行put操作触发扩容时,底层链表可能生成环形结构,后续对该HashMap的读写操作会进入无限遍历,线程持续处于RUNNABLE状态且占用CPU,和观测到的现象完全一致。说明日期解析全链路中存在被多线程共享的可变HashMap实例,且无同步控制。 DateTimeFormatter的线程安全性被破坏
官方声明DateTimeFormatter为线程安全类,但两类场景会打破这一特性:- 所用JDK 8为早期小版本,存在已知bug:部分版本中
DateTimeFormatter的内部解析缓存使用了未做同步的HashMap,并发调用解析逻辑时会触发并发修改问题 - 解析逻辑引入了自定义扩展:比如自定义
TemporalQuery、自定义解析器等,这些扩展实现内部持有可变HashMap且未做线程安全处理
- 所用JDK 8为早期小版本,存在已知bug:部分版本中
TreeBasedTable比较逻辑的并发调用传导问题
Guava的TreeBasedTable在多线程同时执行写入、查询操作时,会并发调用自定义的行键Comparator。如果Comparator内部调用LocalDate.parse的逻辑中用到了非线程安全的共享实例,就会将并发问题传导至底层的HashMap操作,最终触发死循环。
内容的提问来源于stack exchange,提问作者Aleksandr Bonduryansky
相关产品推荐
相关产品推荐

