Java memory model清楚地说明了线程如何通过内存进行交互可以和不可以假设的内容。例如,如果一个线程在没有适当同步的情况下将新值写入字段,则不保证新值可由其他线程观察到。然而,实际上,尽管同步不充分,其他线程仍可以读取新值,具体取决于写入和读取之间的时间,硬件架构等。
这可能导致难以发现且难以复制的错误。因此,在最坏情况的JVM上运行java应用程序非常有用,它在Java memory model中的保证之外的线程之间绝对没有内存同步。是否存在这种最坏情况的JVM实现?
答案 0 :(得分:2)
您可以尝试使用Terracotta群集您的程序。对于不正确的同步(即使集群中只有一个节点也会变得明显),这是非常不可原谅的。这是一个伟大的问题:我经常想要这种能力 - 我很惊讶标准JRE中没有切换-XXJMMExtreme
Terracotta是开源的,免费提供基本产品。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不知道任何VM始终保证最坏的情况,这似乎是你要求的。您正在描述的情况可能发生在Sun VM(以及许多其他虚拟机)上,但仅由于缓存问题。我不熟悉一直故意这样做的虚拟机。
答案 3 :(得分:0)
有很多方法可以触发并发错误。
对于最坏情况的JVM,请尝试使用手机。 (你的申请可能根本不起作用);)
答案 4 :(得分:0)
同步错误通常难以重现,因为它们依赖于不同线程之间的细微时序,因此实际上只是“只运行程序”的实现并不总是“最糟糕的”。如果只执行一次这些指令,则无法重现两个线程可以交错指令的多种不同方式。在一次运行中测试所有这些组合的可能性更小。其中一个海报建议使用Java Pathfinder,这听起来不错 - 但请注意,它是一个多次运行相同代码的应用程序,因此您无法真正将其视为另一个JVM实现。
另一个实用技巧是尝试在尽可能多的不同JVM上运行应用程序。尝试不同的供应商,来自同一供应商的不同版本,不同的CPU架构等。几年前,我有一个大型多线程应用程序的经验,该应用程序已在Xeon CPU上的Sun JVM上开发,测试和运行,并且运行良好。有一次我尝试在POWER架构上的IBM J9 Java虚拟机上运行它,并且在第一次尝试时,由于同步错误,大约有2/3的测试失败了。因此,在不同环境中进行测试可以很好地揭示隐藏的同步问题。