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

请教一个 AtomicBoolean 与 volatile 的问题

  •  
  •   lry · 2021-01-25 17:14:11 +08:00 · 2156 次点击
    这是一个创建于 1382 天前的主题,其中的信息可能已经有所发展或是发生改变。

    AtomicBoolean 的读方法有四种 get()getPlain()getOpaque()getAcquire() 对应的写方法也有 set()setPlain()setOpaque()setRelease()

    看了文档也比较迷惑,例如 with memory semantics of reading 这句英文没懂是什么意思

    这些方法区别是什么呢 ==

    另外 volatile AtomicBooleanAtomicBoolean 会有区别吗

    6 条回复    2021-01-25 21:50:11 +08:00
    palmers
        1
    palmers  
       2021-01-25 17:46:44 +08:00
    `volatile AtomicBoolean ` 这种用法是不对的 我认为冗余了 AtomicBoolean 内部值已经是 volatile 了 另外 这个是不是应该 `volatile bool `和`AtomicBoolean bool` 的区别的问题?
    mightofcode
        2
    mightofcode  
       2021-01-25 18:02:04 +08:00
    这两个除了都属于并发编程之外,没有一点关系
    0x666666
        3
    0x666666  
       2021-01-25 18:13:11 +08:00
    @palmers #1 同意你的说话,Atomic 本身的 state 已经用了 volatile,外面再使用 volatile 修饰 Atomic 没有太大的必要。
    chendy
        4
    chendy  
       2021-01-25 18:32:07 +08:00   ❤️ 1
    搜到了一个这: https://xie.infoq.cn/article/b6e6986aa7afa4d8278ff6f63

    普通变量是不确保内存可见的,opaque 、release/acquire 、volatile 是可以保证内存可见的

    opaque 确保程序执行顺序,但不保证其它线程的可见顺序

    release/acquire 保证程序执行顺序,setRelease 确保前面的 load 和 store 不会被重排序到后面,但不确保后面的 load 和 store 重排序到前面; getAcquire 确保后面的 load 和 store 不会被重排序到前面,但不确保前面的 load 和 store 被重排序。

    volatile 确保程序执行顺序,能保证变量之间的不被重排序。
    mightofcode
        5
    mightofcode  
       2021-01-25 18:34:04 +08:00
    “另外 volatile AtomicBoolean 和 AtomicBoolean 会有区别吗”

    volatile 跟 AtomicBoolean 没有丝毫关系,这个问题就没有意义
    SoloCompany
        6
    SoloCompany  
       2021-01-25 21:50:11 +08:00
    你应该使用 final 而不是 volatile
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4166 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:00 · PVG 09:00 · LAX 17:00 · JFK 20:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.