就是下面的代码是交替打印 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 后再判断一次就好了
|