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