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

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Javaer 帮忙看下一个多线程的小问题
未分類
21 7 月 2020

Javaer 帮忙看下一个多线程的小问题

Javaer 帮忙看下一个多线程的小问题

資深大佬 : chanlk 15

主函数开启了两个线程, 其中一个是负责增加一个 Value 类中的静态变量, 另一个是负责检查这个静态变量的值,当这个值达到一定值后就开始打印;

为什么下面这段程序的 CheckThread 不能输出?那个 value 的值在几秒钟时间就超过 500000000 了

另外奇怪的是 CheckThread 在 while(true)的后面增加一个打印,就能进 if 里面了,详情见代码;

下面是代码:

class Scratch {     public static void main(String[] args) {         new IncreasingThread().start();         new CheckThread().start();     } }  class Value {     static long value = 0; }  class IncreasingThread extends Thread {     @Override     public void run() {         while (true) {             Value.value++;         }     } }  class CheckThread extends Thread {     @Override     public void run() {         while (true) {            // 打开下面的这行注释,就能进去 if 里执行打印了            // System.out.println(Value.value);             if (Value.value > 500000000) {                 System.out.println("value over 500000000");             }         }     } } 

大佬有話說 (10)

  • 資深大佬 : snowydec

    volatile 关键字

  • 資深大佬 : zhgg0

    println 里面有个锁。没有锁,没有 volitale,线程之间变量的更改不可见。

  • 資深大佬 : amai0w0

    system.out 内部加锁,间接保证了内存可见性,不加打印的话应该把 value 设为 volatile 。

  • 資深大佬 : anakinsky

    JMM 了解下

  • 資深大佬 : fubei

    volatile

  • 主 資深大佬 : chanlk

    谢谢各位,我得去系统的学习下这方面的知识了

  • 資深大佬 : ChanKc

    建议去看 Effective Java 和 Java lang spec

  • 資深大佬 : Jacky23333

    value 需要加个 volatile 修饰保证变量的可见性,主可以看看 java 内存模型相关的内容

  • 資深大佬 : serical

    R 大有解释过这个问题 https://www.zhihu.com/question/39458585/answer/81521474

  • 資深大佬 : br00k

    换成 AtomicLong 不好吗?线程安全

文章導覽

上一篇文章
下一篇文章

AD

其他操作

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

51la

4563博客

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