【问题标题】:Suddenly lots of BrokenBarrierExceptions in a test测试中突然出现很多 BrokenBarrierExceptions
【发布时间】:2011-05-07 20:18:42
【问题描述】:

两年后,我的一项测试(测试一些并发数据库事务的东西)突然开始失败,并在构建服务器上出现 BrokenBarrierException。它曾经一直工作,现在它失败了三分之一的构建。它在 Windows 工作站上永远不会失败。

有人知道为什么吗?

构建服务器使用以下操作系统: Linux 版本 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc 版本 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005 在一对氙气芯片上

还有这个 java 版本: java版本“1.6.0_16” Java(TM) SE 运行时环境 (build 1.6.0_16-b01) Java HotSpot(TM) 服务器虚拟机(build 14.2-b01,混合模式)

  • 艾瑞克

【问题讨论】:

  • 最近Java/OS版本有变化吗?
  • 不,据我所知。操作系统可能已经在我不知情的情况下进行了修补,但它看起来有点旧,而且正常运行时间是几个月。

标签: java linux concurrency


【解决方案1】:

我会冒险猜测这些失败是真实的。

许多技术上不正确的并发代码的问题在于它可以在大量的实现上工作。典型的例子是在需要可见性时未能将字段声明为volatile,这通常在单核机器上工作,然后在多核机器上失败。但是,可能会发生更微妙的错误,这些错误取决于 JLS允许但可能未在任何当前 JVM 实现中实现的潜在重新排序。

有可能进行了硬件/软件升级,这应该是微不足道的,但现在正在解决这个并发问题。或者,日期的更改影响问题的可见性的可能性很小(如果您在测试中使用new Date() 之类的东西,理论上不同的值可能会导致优化使用稍微不同的路径)。或者这甚至可能归结为其他一些过去经常在盒子停止时运行的进程;当有更多空闲周期时,HotSpot 完全有可能会查看 CPU 利用率并执行更积极的优化(我不认为它确实这样做,事实上,但它可以)。

基本上,如果您遇到的并发问题仅通过一些细微的重新排序或优化暴露出来,这可能会也可能不会发生,具体取决于 JVM 编译器的实现细节。所以安装一个新的 JVM 可能会触发这种情况,但同样可能会被 anything 触发,从而导致编译器的行为略有不同。

【讨论】:

  • 一般情况下,情况往往如此。
  • 然而,对于这种特殊情况,我不认为糟糕的编程是原因。首先,在这种情况下并发是极其微不足道的。其次,它是由经验丰富的并发程序员开发的。第三,它已经运行了两年没有一个破壁垒。
  • 我真正想知道的是,是否有人听说过 Linux 或 Barriers 或类似问题的类似问题,因为一些意外。例如,它可能是适用于多 CPU 系统、超线程等的 JVM 或操作系统级别的错误/互操作性问题。系统既老化又超载,因此任何错误(包括硬件错误)都可能出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多