【发布时间】:2012-08-13 11:41:08
【问题描述】:
我在生产代码中遇到了一个突然的问题,自过去 5 到 6 年以来就没有发生过。我有一个线程池,它最多生成 64 个线程,所有 64 个线程都读取一些数据并将其放入一个通用的Map 中以供进一步处理。
读取是由来自特定源的所有线程完成的,我已经验证数据确实是从源读取的,但是,一个特定的批次没有被放入Map。
这是一个代码sn-p(由于保密问题,不能放整个代码):
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")
}
问题:特定线程未进入同步块,未放入映射,未打印 "bla bla bla",未打印 "error",但会打印 "done"。
我已经验证了一切...代码中没有任何变化,这个问题突然出现了。问题是,我不能放任何额外的日志,因为它是生产代码,没有得到所有客户的同意,但这是最后一部分。
有没有人遇到过类似的问题,或者对此有所了解?正在读取的数据非常庞大,有 6000 条记录,每条记录至少有 0f 30-40 列数据。
提前致谢。
编辑:捕捉 Throwable 而不是 Exception
【问题讨论】:
-
代码中有
try/finally吗? -
发布实际代码。您发布的内容几乎没有任何信息。
-
@AaronDigulla:为尝试而编辑....catch。打印“finally”中的内容,不会导致异常。
-
我将从显而易见的开始: 1. 在
try块内查找return语句。 2. 寻找未被catch块捕获的异常(和errors)。 -
没有足够的细节来解决您的问题。此外,一般来说,发布一个众所周知的算法不会损害您的 NDA。只是不要向我们发布您正在解析的 csv 文件。我不是律师
标签: java multithreading synchronized