java volatile 在arm下反汇编结果以及模板解释器对应代码

public class A {
        volatile int a = 0;
        public static void main(String[] args) {
                A a = new A();
                a.testVolatile();
        }
        public int testVolatile() {
                a = 126;
                return a;
        }
}
root@ecs-b074:~# java -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,A.testVolatile -XX:CompileCommand=dontinline,A.testVolatile A 
# ------------------ a = 126 ---------------------
# c1 编译器
0x0000ffff65172230:   orr	w0, wzr, #0x7e  # wzr 零寄存器,和 126 做或运算 结果送入w0寄存器
0x0000ffff65172234:   dmb	ish	# 在同一共享域(一般多个cpu属于一个共享域) 观察 保证前面的指令读写指令一定先于 下面这条写a 的指令感知到    dmb是说针对所有的读写指令生效 ish 1. 指定作用域属于内部作用于, 同时对于store load / load store / load load / store store 都不能越过屏障, 前半段是对什么样的指令生效, 后半段则是作用范围,指令如何组合
0x0000ffff65172238:   str	w0, [x1,#12]  #把w0 中的 126 送入 x1 + 12 的内存位置
0x0000ffff6517223c:   dmb	ish  # 同理, 要保证 写a的指令先于后米的指令被其他cpu感知到

# c2 编译器
0x0000ffff8cc39194:   sub	sp, sp, #0x20
0x0000ffff8cc39198:   stp	x29, x30, [sp,#16]
0x0000ffff8cc3919c:   orr	w12, wzr, #0x7e. # 0x7e  # wzr 零寄存器,和 126 做或运算 结果送入w12寄存器
0x0000ffff8cc391a0:   add	x10, x1, #0xc  
0x0000ffff8cc391a4:   stlr	w12, [x10]   # store release 语义的写 把w12的值写入 寄存器X10指向的地址位置
0x0000ffff8cc391a8:   ldp	x29, x30, [sp,#16]
0x0000ffff8cc391ac:   add	sp, sp, #0x20
0x0000ffff8cc391b0:   ldr	x8, [x28,#832]             
0x0000ffff8cc391b4:   cmp	sp, x8
0x0000ffff8cc391b8:   b.hi	0x0000ffff8cc391c0

# -------------- read a -----------------------
# C1 
0x0000ffff9117224c:   dmb	ish	# Any-Any
0x0000ffff91172250:   ldr	w0, [x1,#12] # 加载a
0x0000ffff91172254:   dmb	ishld  # Load - Load, Load - Store

# C2
0x0000ffff98c391ac:   ldar	w0, [x10]. # load acquire 语义的读
linux arm 内存屏障
__sync_synchronize(); // dmb	ish
__atomic_thread_fence(__ATOMIC_ACQUIRE); // dmb	ishld
__atomic_thread_fence(__ATOMIC_RELEASE); // dmb	ish

jdk17 宏定义
#define FULL_MEM_BARRIER  __sync_synchronize()
#define READ_MEM_BARRIER  __atomic_thread_fence(__ATOMIC_ACQUIRE);
#define WRITE_MEM_BARRIER __atomic_thread_fence(__ATOMIC_RELEASE);

// orderAccess_linux_aarch64.hpp
inline void OrderAccess::loadload()   { acquire(); }
inline void OrderAccess::storestore() { release(); }
inline void OrderAccess::loadstore()  { acquire(); }
inline void OrderAccess::storeload()  { fence(); }

inline void OrderAccess::acquire() {
  READ_MEM_BARRIER;
}

inline void OrderAccess::release() {
  WRITE_MEM_BARRIER;
}

inline void OrderAccess::fence() {
  FULL_MEM_BARRIER;
}

在这里插入图片描述


// 写值前 如果是volatile 放一个store store屏障
{
    Label notVolatile;
    __ tbz(r5, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
    __ membar(MacroAssembler::StoreStore);
    __ bind(notVolatile);
  }

 // dtos 栈顶缓存时dtos情况
  {
    __ pop(dtos);
    if (!is_static) pop_and_check_object(obj);
    __ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg);
    if (rc == may_rewrite) {
      patch_bytecode(Bytecodes::_fast_dputfield, bc, r1, true, byte_no);
    }
  }
  
  {
    Label notVolatile;
    __ tbz(r5, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
    __ membar(MacroAssembler::StoreLoad);
    __ bind(notVolatile);
  }

参考:
dmb解释1
dmb解释2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值