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

缓存一致性协议解决了可见性问题,那为什么 Java 代码还要解决可见性问题?

  •  
  •   zhao1014 · 2020-12-13 21:24:22 +08:00 · 2431 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有点迷惑

    10 条回复    2020-12-14 13:49:33 +08:00
    hendyzone
        1
    hendyzone  
       2020-12-13 21:38:32 +08:00
    不太确定,一个最小是进程间的可见性 一个最小是线程间的?
    mrsatangel
        2
    mrsatangel  
       2020-12-13 21:51:04 +08:00
    在大多数处理器的默认情况下,cache coherence 不能保证 sequential consistency,需要用户通过 lock 等指令显式同步 cache 和 main memory . JVM 层面解决的可见性指的就是在语言层面暴露“显式同步 cache 和 main memory”的方法。注意下 coherence 和 consistency.
    zhao1014
        3
    zhao1014  
    OP
       2020-12-13 21:53:27 +08:00 via Android
    @hendyzone 就我从书上看到的来说,它是以一个处理器执行一条线程为前提,多条线程并行执行的情况,缓存一致性协议用于解决可见性的问题。也许 java 层面解决的是线程并发情况下的可见性问题?
    zhao1014
        4
    zhao1014  
    OP
       2020-12-13 21:54:26 +08:00 via Android
    @mrsatangel 谢谢大佬!
    hendyzone
        5
    hendyzone  
       2020-12-13 21:56:24 +08:00
    @zhao1014 嗯 不太了解这块 前来学习
    wweir
        6
    wweir  
       2020-12-14 08:27:40 +08:00 via Android   ❤️ 1
    缓存一致性协议只能解决单线程的一致性问题,多线程、教程、协程的问题得人为保证
    xhystc
        7
    xhystc  
       2020-12-14 09:48:45 +08:00 via iPhone   ❤️ 1
    根本原因是由于性能问题 cpu 在修改共享变量时不会等待其他 cpu 都确认缓存失效后才继续执行,其他 cpu 在收到失效请求后也不会立即应用失效,这就造成了不一致
    bjking2014
        8
    bjking2014  
       2020-12-14 11:56:15 +08:00   ❤️ 1
    引入缓存一致性协议还存在 ack 阻塞的性能问题,为了解决阻塞带来的性能问题引入了写缓冲器和无效队列,写缓冲器是修改变量的指令丢缓冲器里,然后去执行其他指令。无效队列是收到失效指令后放到无效队列里备用。还有指令重排,在写入前,也会保证所有之前发生的事情已经发生,并且更新过的数据值也是可见的。内存屏障会把之前的写入值都刷新到缓存
    所以 java 用 Volatile 可以保证可见性
    Jooooooooo
        9
    Jooooooooo  
       2020-12-14 12:01:17 +08:00   ❤️ 2
    不同硬件不一样

    有些硬件一致性强, 比如可以强到 jvm 什么都不做就能保障 volatile 的语义. 有些硬件弱一点, 就得加屏障.

    所以不能依赖这个
    zhao1014
        10
    zhao1014  
    OP
       2020-12-14 13:49:33 +08:00 via Android
    @wweir
    @xhystc
    @bjking2014
    @Jooooooooo
    谢谢大佬们
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6160 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.