
就是下面的代码是交替打印 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(); } } 1 popesaga Jul 23, 2020 count++ 不是原子操作,再了解一下 volatile 和 AtomicInteger 。一个线程在做 count < 100 判断的时候读到了 99,然后才有另外一个线程的 count++ 引起的新值 100 更新的操作,再接着一个释放锁一个获得锁,100 就会被打印出来。 |
2 sonice Jul 23, 2020 用 AtomicInteger |
3 araraloren Jul 23, 2020 count 是 99 的时候可能让两个线程同时通过 while 条件。。 |
5 JasonLaw Jul 23, 2020 |
6 eve1yb0dy Jul 23, 2020 我关注楼主名字...起的有意思 |
7 kkkkkrua Jul 23, 2020 这写法不过关啊,看看 Reentrantlock |
8 M1NGc Jul 24, 2020 用同步队列 |
9 Octopvs Jul 29, 2020 用双重检查锁就可以,sync 前判断一次<100,sync 后再判断一次就好了 |