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

cas

  •  
  •   choice4 · 2019-01-14 17:51:15 +08:00 · 1296 次点击
    这是一个创建于 1919 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    fuchaofather
        1
    fuchaofather  
       2019-01-14 18:12:29 +08:00
    谈谈我的理解:
    cpu 内部寄存器包括 cache**对应用程序透明**由硬件 MMU 管理, 所以我的理解底层实际就是主存, cache 一致性是由一致性协议保证的, 至于你说的问题 2, cas 是指令级别的这个不用担心
    知识有限, 可能有误, 仅供参考
    fuchaofather
        2
    fuchaofather  
       2019-01-14 18:14:34 +08:00
    emm...我说的底层是主存指值, 至于是不是从 cache 读的那就是 mmu 的事儿了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1005 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.