2017-09-02 58 views
2
@State 
@JCStressTest 
public class M { 
    class A { 
     int f; 
     A() { 
      f = 42; 
     } 
    } 
    private A a; 

    @Actor 
    void actor1(){ 
     a = new A(); 
    } 
    @Actor 
    void actor2(IntResult1 r){ 
     r.r1 = 1; 
     if(a != null){ 
      r.r1 = a.f; 
     } 
    } 
} 

我用jcstress测试了它,我无法得到输出0。我知道这是不明显的,我应该看到输出,但它是可能的,我希望看到它。是否有任何JVM选项(如XX:....)来强制执行?数据竞赛和安全出版物

回答

2

我知道这是不明显,我应该看到输出,但它是可能的,我希望看到它。

你是对的,你的代码确实有数据竞争。

(没有之前发生f = 42和下开展的JMM规则... = a.f抵扣之间链。因此,它不是保证a.f总会看到值42

然而,这场比赛的性质只会在极其罕见的情况下发生。它很可能需要一个具有多个内核的系统,并且在错误的时刻切换高内存负载或非自愿的线程环境。这将取决于JIT编译器发出的本机代码。

是否有任何JVM选项(如XX:....)来执行它?

不幸的是,没有没有。


1 - 请注意,您不能从字节码绘制声音推论。 JIT编译器允许(由JLS/JVMS)重新排序指令,包括内存读取和写入,只要它们不违反JMM规则。这对于多线程代码的性能很重要。