V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
memedahui
V2EX  ›  Java

关于 Java 的指令排序问题

  •  1
     
  •   memedahui · 2023-08-11 10:54:41 +08:00 · 1052 次点击
    这是一个创建于 499 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我看到的资料说英特尔 x86 的芯片因为没有失效队列,所以在某些情况不会乱序,但是我的电脑用的是英特尔的 i5-12400,使用了 org.openjdk.jcstress 测试还是出现了乱序,理论上 arm 上面才会乱序,我要怎么复现不乱序的情况(不能修改代码,不使用屏障)?哪位知道的求解
    代码如下
    @JCStressTest
    @Outcome(id = "0, 0", expect = Expect.ACCEPTABLE, desc = "OK")
    @Outcome(id = "0, 1", expect = Expect.ACCEPTABLE, desc = "OK")
    @Outcome(id = "1, 0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "NOT OK")
    @Outcome(id = "1, 1", expect = Expect.ACCEPTABLE, desc = "OK")
    @State
    public class Demo {

    int a;
    int b;

    @Actor
    public void actor1() {
    a = 1;
    b = 1;
    }

    @Actor
    public void actor2(II_Result r) {
    r.r1 = b;
    r.r2 = a;
    }
    }
    结果如下
    0, 0
    1,418,619 ACCEPTABLE OK
    0, 1
    12,299 ACCEPTABLE OK
    1, 0
    858 ACCEPTABLE_INTERESTING NOT OK
    1, 1
    128,197,735 ACCEPTABLE OK

    1, 0 这种情况是不应出现的,还是出现了 858 次
    1 条回复    2023-08-14 14:25:38 +08:00
    letianqiu
        1
    letianqiu  
       2023-08-14 14:25:38 +08:00
    Java 的 memory model 和 micro-architecture 的 memory model 是不同的。x86 是 total store ordering ,arm 是 weak memory order 。但是对于 Java 来说,jvm 实现保证了在 x86 和 arm 上都符合 Java Memory Model 的 spec 。回到你的问题,你这段代码里,a 和 b 既不是 volatile 的,同时 read/write 也没有用 atomic/lock ,所以不存在 happens-before 的关系。四种情况都是可能的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:49 · PVG 10:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.