我在生产代码中遇到了一个突然的问题,自过去 5-6 年以来就没有发生过。我有一个线程池,它最多生成 64 个线程,所有 64 个线程都读取一些数据并将其放在一个公共中Map
以供进一步处理。
读取是由来自特定源的所有线程完成的,我已经验证数据确实是从源读取的,但是,一个特定的批次没有被放入Map
.
这是一个代码片段(由于保密问题,不能放整个代码):
try {
<read the data>
.
.
<do processing>
.
.
synchronized(glock) { //glock is a class attribute, Object glock = new Object[];
map.put(<data that was read>);
log.debug("bla bla bla")
}
} catch(Throwable e) {
log.error("error")
}
finally {
log.debug("done")
}
ISSUE:特定线程不进入同步块,不放入映射,不打印"bla bla bla"
,不打印"error"
但打印"done"
。
我已经验证了一切......代码中没有任何变化,这个问题突然出现了。问题是,我不能放任何额外的日志,因为它是生产代码,没有得到所有客户的同意,但这是最后一部分。
有没有人遇到过类似的问题,或者对此有所了解?正在读取的数据非常庞大,有 6000 条记录,每条记录至少有 0f 30-40 列数据。
提前致谢。
编辑:捕捉Throwable
而不是Exception