我在我们的一个项目中遇到了一个奇怪的问题。我们使用JUnit运行单元测试,一段时间以来,我们开始并行运行测试以加速执行。大多数情况下,一切正常,但有时几乎所有测试都失败了。在下一次运行时,它们都通过了,而没有更改任何代码。
错误似乎表明,在多线程情况下,某些静态实例没有正确初始化或在初始化完成之前被使用。(我不能调试这个问题,因为当调试时,这个问题从未出现过 -> Heisenbug)。
抱歉,我无法提供一个最小的工作示例来显示错误,因为在尝试复制时它会消失。
具体问题是:当像下面这样声明变量时,当另一个线程调用foo()或bar()时,a或b的初始化是否有可能尚未完成?我认为静态块应该保证在调用任何方法之前执行。或者可能存在类加载器问题吗?或者JRE中已知的错误(我们目前卡在1.6.0_21上,我们的IT部门还没有提供更新版本)?
我确定这与硬件无关,因为它在来自不同制造商的不同机器上都显示出来。测试正在使用服务器虚拟机。
错误似乎表明,在多线程情况下,某些静态实例没有正确初始化或在初始化完成之前被使用。(我不能调试这个问题,因为当调试时,这个问题从未出现过 -> Heisenbug)。
抱歉,我无法提供一个最小的工作示例来显示错误,因为在尝试复制时它会消失。
具体问题是:当像下面这样声明变量时,当另一个线程调用foo()或bar()时,a或b的初始化是否有可能尚未完成?我认为静态块应该保证在调用任何方法之前执行。或者可能存在类加载器问题吗?或者JRE中已知的错误(我们目前卡在1.6.0_21上,我们的IT部门还没有提供更新版本)?
class C {
private static final A a;
private static final B b;
static {
a = new A(...);
b = new B(...);
}
public static void foo() {
useA();
}
public static void bar() {
useB();
}
}
我确定这与硬件无关,因为它在来自不同制造商的不同机器上都显示出来。测试正在使用服务器虚拟机。
谢谢,
Axel
new A()
或new B()
会启动新线程吗?您尝试过隔离问题并创建能够复现问题的SSCCE吗? - assylias