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

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 求大佬解答一下关于两个线程交替打印奇偶数的问题
未分類
17 7 月 2020

求大佬解答一下关于两个线程交替打印奇偶数的问题

求大佬解答一下关于两个线程交替打印奇偶数的问题

資深大佬 : bee7 7

就是下面的代码是交替打印 0 到 100 的奇偶数,我这里的循环条件是 count 小于 100,为什么最后的输出结果会一直到 100 呢,不是 100 就跳出循环执行不到了吗,求大佬解答

public class WaitNotifyPrintOddEvenSyn {     private static int count;     private static final Object lock = new Object();          //新建 2 个线程,一个只处理偶数,一个只处理奇数     //并且用 synchronized 来通信     public static void main(String[] args) {                 new Thread(new Runnable() {             @Override             public void run() {                 while(count < 100){                     synchronized (lock){                         if((count & 1) == 0){                             System.out.println(Thread.currentThread().getName() + ": " + count);                             count++;                         }                     }                 }             }         }, "偶线程").start();          new Thread(new Runnable() {             @Override             public void run() {                 while(count < 100){                     synchronized (lock){                         if((count & 1) == 1){                             System.out.println(Thread.currentThread().getName() + ": " + count);                             count++;                         }                     }                 }             }         }, "奇线程").start();     } } 

大佬有話說 (8)

  • 資深大佬 : popesaga

    count++ 不是原子操作,再了解一下 volatile 和 AtomicInteger 。一个线程在做 count < 100 判断的时候读到了 99,然后才有另外一个线程的 count++ 引起的新值 100 更新的操作,再接着一个释放锁一个获得锁,100 就会被打印出来。

  • 資深大佬 : sonice

    用 AtomicInteger

  • 資深大佬 : araraloren

    count 是 99 的时候可能让两个线程同时通过 while 条件。。

  • 主 資深大佬 : bee7

    @popesaga 感谢大佬,懂了!!

  • 資深大佬 : JasonLaw

    @popesaga #1
    @bee7 #4

    count++本身不是原子操作,但是代码里已经使用了内置锁保证了 count++的原子性。根本问题不是 count++,而是没有用锁保护好 count 这个共享可变变量,也就是两个线程可以“同时”执行 count < 100 判断。如果当前 count 是 99,奇线程执行判断成功,获取锁,但是在更新 count 值之前,这个时候奇线程中止了,轮到偶线程执行,虽然判断成功,但是没办法获取锁,不过等到奇线程释放锁之后,偶线程就可以获取到锁了,最后偶线程会打印出 100 。

  • 資深大佬 : eve1yb0dy

    我关注主名字…起的有意思

  • 資深大佬 : kkkkkrua

    这写法不过关啊,看看 Reentrantlock

  • 資深大佬 : M1NGc

    用同步队列

文章導覽

上一篇文章
下一篇文章

AD

其他操作

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

51la

4563博客

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