gpt4 book ai didi

java - volatile 语句的负载屏障在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:33 26 4
gpt4 key购买 nike

我写了这个简单的 Java 程序:

package com.salil.threads;

public class IncrementClass {

static volatile int j = 0;
static int i = 0;

public static void main(String args[]) {

for(int a=0;a<1000000;a++);
i++;
j++;
}
}

这将为 i++ 和 j++ 生成以下反汇编代码(删除剩余的反汇编代码):

  0x0000000002961a6c: 49ba98e8d0d507000000 mov       r10,7d5d0e898h
; {oop(a 'java/lang/Class' = 'com/salil/threads/IncrementClass')}
0x0000000002961a76: 41ff4274 inc dword ptr [r10+74h]
;*if_icmpge
; - com.salil.threads.IncrementClass::main@5 (line 10)
0x0000000002961a7a: 458b5a70 mov r11d,dword ptr [r10+70h]
0x0000000002961a7e: 41ffc3 inc r11d
0x0000000002961a81: 45895a70 mov dword ptr [r10+70h],r11d
0x0000000002961a85: f083042400 lock add dword ptr [rsp],0h
;*putstatic j
; - com.salil.threads.IncrementClass::main@27 (line 14)

这是我对以下汇编代码的理解:

  • mov r10,7d5d0e898h : 将指针移动到 IncrementClass.class 以注册 r10
  • inc dword ptr [r10+74h] : 递增[r10 + 74h]地址处的4字节值,(即i)
  • mov r11d,dword ptr [r10+70h] :将地址[r10 + 70h]处的4个value值移动到寄存器r11d(即将j的值移动到r11d)
  • inc r11d : 递增 r11d
  • mov dword ptr [r10+70h],r11d : 将 r11d 的值写入 [r10 + 70h] 以便其他线程可见-lock add dword ptr [rsp],0h : 锁定栈指针rsp所代表的内存地址并加0。

JMM 声明在每次 volatile 读取之前必须有一个加载内存屏障,而在每次 volatile 写入之后必须有一个存储屏障。我的问题是:

  1. 为什么在将 j 读入 r11d 之前没有负载屏障?
  2. 锁和添加到 rsp 如何确保 r11d 中 j 的值传回主内存。我从英特尔规范中读到的所有内容是,锁在操作期间为 cpu 提供了对指定内存地址的排他锁。

最佳答案

英特尔处理器 x86 有一个 strong memory model .

因此,所有屏障 StoreStore、LoadLoad、LoadStore 在 x86 上都是空操作。StoreLoad 除外,它可以通过 mfence 或cpuid 或locked insn 实现。您已经可以用您的汇编代码确认这一点。其他障碍仅意味着对编译器优化和转换的限制,以便它们不会破坏 java memory model spec .

当您在英特尔处理器上运行时,我假设它是 x86。

请阅读

  1. http://gee.cs.oswego.edu/dl/jmm/cookbook.html以供引用。

  2. http://psy-lob-saw.blogspot.com/2013/08/memory-barriers-are-not-free.html

  3. http://jsr166-concurrency.10961.n7.nabble.com/x86-NOOP-memory-barriers-td9991.html

Lock 不是指令而是指令前缀(表现为 storeLoad 屏障)。

  1. What does the "lock" instruction mean in x86 assembly?
  2. Why we need lock prefix before CMPXCHG

关于java - volatile 语句的负载屏障在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27772910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com