Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 大约两个线程交替打印奇数和偶数_Java - Fatal编程技术网

Java 大约两个线程交替打印奇数和偶数

Java 大约两个线程交替打印奇数和偶数,java,Java,也就是说,下面的代码交替打印0到100之间的奇数和偶数。我的循环条件是计数小于100 为什么最终输出结果达到100?如果不是100,则跳出循环后无法执行 public class WaitNotifyPrintOddEvenSyn { private static int count; private static final Object lock = new Object(); //新建 2 个线程,一个只处理偶数,一个只处理奇数 //并且用 syn

也就是说,下面的代码交替打印0到100之间的奇数和偶数。我的循环条件是计数小于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();
    }
}
public类WaitNotifyPrintOddEvenSyn{
私有静态整数计数;
私有静态最终对象锁=新对象();
//新建 2.个线程,一个只处理偶数,一个只处理奇数
//并且用 同步的来通信
公共静态void main(字符串[]args){
新线程(newrunnable()){
@凌驾
公开募捐{
同时(计数<100){
已同步(锁定){
如果((计数&1)==0){
System.out.println(Thread.currentThread().getName()+“:”+count);
计数++;
}
}
}
}
}, "偶线程").start();
新线程(newrunnable()){
@凌驾
公开募捐{
同时(计数<100){
已同步(锁定){
如果((计数&1)==1){
System.out.println(Thread.currentThread().getName()+“:”+count);
计数++;
}
}
}
}
}, "奇线程)。开始();
}
}

当变量
count
的值为
99
时发生这种情况

考虑两个有趣的场景:

偶线程: 0
奇线程: 1
偶线程: 2
奇线程: 3
偶线程: 4
奇线程: 5
偶线程: 6
奇线程: 7
偶线程: 8
奇线程: 9
偶线程: 10
奇线程: 11
偶线程: 12
奇线程: 13
偶线程: 14
奇线程: 15
偶线程: 16
奇线程: 17
偶线程: 18
奇线程: 19
偶线程: 20
奇线程: 21
偶线程: 22
奇线程: 23
偶线程: 24
奇线程: 25
偶线程: 26
奇线程: 27
偶线程: 28
奇线程: 29
偶线程: 30
奇线程: 31
偶线程: 32
奇线程: 33
偶线程: 34
奇线程: 35
偶线程: 36
奇线程: 37
偶线程: 38
奇线程: 39
偶线程: 40
奇线程: 41
偶线程: 42
奇线程: 43
偶线程: 44
奇线程: 45
偶线程: 46
奇线程: 47
偶线程: 48
奇线程: 49
偶线程: 50
奇线程: 51
偶线程: 52
奇线程: 53
偶线程: 54
奇线程: 55
偶线程: 56
奇线程: 57
偶线程: 58
奇线程: 59
偶线程: 60
奇线程: 61
偶线程: 62
奇线程: 63
偶线程: 64
奇线程: 65
偶线程: 66
奇线程: 67
偶线程: 68
奇线程: 69
偶线程: 70
奇线程: 71
偶线程: 72
奇线程: 73
偶线程: 74
奇线程: 75
偶线程: 76
奇线程: 77
偶线程: 78
奇线程: 79
偶线程: 80
奇线程: 81
偶线程: 82
奇线程: 83
偶线程: 84
奇线程: 85
偶线程: 86
奇线程: 87
偶线程: 88
奇线程: 89
偶线程: 90
奇线程: 91
偶线程: 92
奇线程: 93
偶线程: 94
奇线程: 95
偶线程: 96
奇线程: 97
偶线程: 98
奇线程: 99
count
的值为99

现在两个线程都通过了第一个过滤器,即
if(count<100)

现在,两个线程将竞相获取变量
lock
上的锁

第一个线程=A
第二个线程=B

情景1:如果A战胜B

然后if条件
if((count&1)==0)
将失败,因为,
count
是奇数

线程A不打印任何内容,A释放锁,B获取锁

现在,B打印值99并将
count
的值增加到100

预期场景1!

但是,可能存在场景2

场景2:如果B战胜A并且A必须等待B完成:

count
的值为99

现在两个线程都通过了第一个过滤器,即
if(count<100)

在这种情况下,if条件,
if((count&1)==1)
作为
count
传递是奇数

B打印值99并将
count
的值增加到100

现在,
if((count&1)==0)
中的if条件也将通过,因为
count
的值为偶数,即100

所以,线程A打印100

那么现在,如何解决这个问题呢?

回答:

偶线程: 0
奇线程: 1
偶线程: 2
奇线程: 3
偶线程: 4
奇线程: 5
偶线程: 6
奇线程: 7
偶线程: 8
奇线程: 9
偶线程: 10
奇线程: 11
偶线程: 12
奇线程: 13
偶线程: 14
奇线程: 15
偶线程: 16
奇线程: 17
偶线程: 18
奇线程: 19
偶线程: 20
奇线程: 21
偶线程: 22
奇线程: 23
偶线程: 24
奇线程: 25
偶线程: 26
奇线程: 27
偶线程: 28
奇线程: 29
偶线程: 30
奇线程: 31
偶线程: 32
奇线程: 33
偶线程: 34
奇线程: 35
偶线程: 36
奇线程: 37
偶线程: 38
奇线程: 39
偶线程: 40
奇线程: 41
偶线程: 42
奇线程: 43
偶线程: 44
奇线程: 45
偶线程: 46
奇线程: 47
偶线程: 48
奇线程: 49
偶线程: 50
奇线程: 51
偶线程: 52
奇线程: 53
偶线程: 54
奇线程: 55
偶线程: 56
奇线程: 57
偶线程: 58
奇线程: 59
偶线程: 60
奇线程: 61
偶线程: 62
奇线程: 63
偶线程: 64
奇线程: 65
偶线程: 66
奇线程: 67
偶线程: 68
奇线程: 69
偶线程: 70
奇线程: 71
偶线程: 72
奇线程: 73
偶线程: 74
奇线程: 75
偶线程: 76
奇线程: 77
偶线程: 78
奇线程: 79
偶线程: 80
奇线程: 81
偶线程: 82
奇线程: 83
偶线程: 84
奇线程: 85
偶线程: 86
奇线程: 87
偶线程: 88
奇线程: 89
偶线程: 90
奇线程: 91
偶线程: 92
奇线程: 93
偶线程: 94
奇线程: 95
偶线程: 96
奇线程: 97
偶线程: 98
奇线程: 99

简单地通过在线程A的if条件中引入一个条件来检查“代码”>计数是否应该是易失的。无论如何,当B1增加到100时,A1可能在同步方法之前等待,然后A1进入100的同步块。夏季,请考虑接受投票,如果它解决了您的用例,请接受我的答案。