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