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

cas

  •  
  •   choice4 · 7 天前 · 402 次点击
    do {
      var5 = this.getIntVolatile(var1, var2);
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    
    说是 var1 是变量值, 
    问题 1.var5 是底层读取值 (底层是哪?。。主存吗)
         在 var2 == var5 时 var1 = var5 + var4
    问题 2.线程中判断到 var2 == var5 后,(还未执行 var1 = var5 + var4 时),瞬间。var2 让其他线程改掉了。
       这不就不安全了吗? 所以说底层还是加锁了吗(这会这个底层又是哪呢)
       我记着以前看过一个视频说是这一步是通过特殊硬件保证的?)
    问题 3.什么是底层啊?主存? c++? cpu? 高速缓存?
    求老哥们解惑
    
    2 回复  |  直到 2019-01-14 18:14:34 +08:00
        1
    fuchaofather   7 天前
    谈谈我的理解:
    cpu 内部寄存器包括 cache**对应用程序透明**由硬件 MMU 管理, 所以我的理解底层实际就是主存, cache 一致性是由一致性协议保证的, 至于你说的问题 2, cas 是指令级别的这个不用担心
    知识有限, 可能有误, 仅供参考
        2
    fuchaofather   7 天前
    emm...我说的底层是主存指值, 至于是不是从 cache 读的那就是 mmu 的事儿了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1685 人在线   最高记录 4236   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1