跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个 Java volatile 字段可见性的问题
未分類
19 5 月 2020

请教一个 Java volatile 字段可见性的问题

请教一个 Java volatile 字段可见性的问题

資深大佬 : dengsq 0

看一个讲解 volatile 可见性教学视频的时候,发现视频中的代码和我运行的效果不太一样,有些困惑。

代码大致如下: https://gist.github.com/dsq123/e57514ca51c875b75d0ea311bb556d92

视频中运行的效果是: 1.number 字段不加 volatile,主线程的循环会一直运行,读不到 number 字段的改变。 2.而加了 volatile 后,number 字段就可见了,程序则会正常结束。

我测试的效果是,不加 volatile 关键字的情况下,主线程依旧可以获取到 AAA 线程对 number 的修改,这是为何?

大佬有話說 (12)

  • 資深大佬 : luozic

    System.out.println 对这个有影响

  • 資深大佬 : luozic

    @luozic 可以参考这个 https://juejin.im/post/5ebadd9df265da7bda414c20

  • 資深大佬 : yanshenxian

    @luozic 感觉不太对 我本地没有复现题主所说的 不加 volatile 主线程可以获取到 AAA 线程对 number 修改的情况

  • 主 資深大佬 : dengsq

    @luozic 确实是这样,是 System.out.println 所影响的。

  • 主 資深大佬 : dengsq

    @yanshenxian 是我的疏忽,我测试时,在主线程的循环里打印了日志,所以读到了其他线程的改动。 然而我贴代码的时候,把主线程的 Sout 删掉了=。=

  • 資深大佬 : yanshenxian

    @dengsq get 了

  • 資深大佬 : Jooooooooo

    不写 volatile 行为不定义

  • 主 資深大佬 : dengsq

    @luozic @yanshenxian @Jooooooooo 还想请教一个问题:
    有一种场景是 [A 线程指令重排导致 B 线程出错] ,如 A 改变了 boolean flag = true/false,而 B 线程需要根据 flag 处理逻辑。

    既然 volatile 可以保证变量的可见性,那么不加 volatile 时,不同线程之间的变量应该是不可见的。

    这样的话,也就不会出现指令重排的问题呀?

  • 資深大佬 : Jooooooooo

    @dengsq 没看懂你说的问题是啥.

    “不加 volatile 时,不同线程之间的变量应该是不可见的” 这句不对. 只能说行为不定义, 可不可见取决于 cpu 的行为, 举个例子. 如果当时机器因为干别的活把当前核给让出做上下文切换了, 这个值就是可见的了

    更极端的例子, 你到一个单线程的机器上跑这个代码, 不会出现不可见的问题

  • 資深大佬 : momocraft

    保证可见的反面是 “不保证” 不是 “保证不”

  • 主 資深大佬 : dengsq

    @Jooooooooo @momocraft 结合二位的回答我就明白了,是我的理解有问题,取反取错了。
    非常感谢

  • 資深大佬 : ArronJun

    打印方法加了同步关键字

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具