繁体   English   中英

线程无法访问同步块

[英]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”是因为它在tryfinally一块中。

您的代码有99%的可能性出了点问题。 这意味着synchronized块中的代码将引发异常,但是您看不到它。

常见的罪魁祸首是:

  • 空的catch块会吞下异常(可以在代码的其他地方)
  • catch块中记录器的异常日志配置,例如,将异常写入另一个日志文件
  • 由于某种原因,日志消息未按顺序写入(因此,ERROR行不在您期望的位置)
  • 某些异常情况(例如内存不足)加上有弹性的代码阻止了日志消息的写入。 地图可能需要惊人的内存量。
  • log不是标准的Java记录器,而是其他东西。

您发现虚拟机中存在错误或硬件问题的可能性很小(<1%)。 如果您可以重复获得相同的结果,则可能不是硬件问题。

如果其他所有操作均失败,则需要在生产中调试问题。 当然,您的客户会反对。 到那时,您将让他们决定哪个对他们更重要:某些规则,您不得调试代码或修复错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM