[英]A thread does not access synchronized block
我在生产代码中突然遇到了一个问题,这是最近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")
}
问题:特定线程未进入同步块,未放入映射,未打印"bla bla bla"
,不打印"error"
但打印了"done"
。
我已经验证了所有内容...代码中没有任何变化,这个问题立即从无处出现。 问题是,我不能放置任何其他日志,因为它是未经所有客户同意的生产代码。但这是最后一部分。
有没有人遇到过类似的问题,或者对此一无所知? 读取的数据量巨大,有6000条记录,每条记录至少具有0f 30-40列数据。
提前致谢。
编辑:捕获Throwable
而不是Exception
从您向我们展示的内容来看,
synchronized(glock){}
在将数据放到地图上而不是打印“ bla bla bla”时引发异常。
打印“ done”是因为它在try
的finally
一块中。
您的代码有99%的可能性出了点问题。 这意味着synchronized
块中的代码将引发异常,但是您看不到它。
常见的罪魁祸首是:
catch
块会吞下异常(可以在代码的其他地方) catch
块中记录器的异常日志配置,例如,将异常写入另一个日志文件 log
不是标准的Java记录器,而是其他东西。 您发现虚拟机中存在错误或硬件问题的可能性很小(<1%)。 如果您可以重复获得相同的结果,则可能不是硬件问题。
如果其他所有操作均失败,则需要在生产中调试问题。 当然,您的客户会反对。 到那时,您将让他们决定哪个对他们更重要:某些规则,您不得调试代码或修复错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.