生産者と消費者の間の誤った目覚めの問題

偽のウェイクアップとは何ですか?

条件が満たされると、複数のスレッドが呼び起こされ、それらのいくつかは実行できませんが
、変数の操作などの操作を実行します。数値は最初は0、スレッドAは+1から数値、スレッドBは-1から数値です。現在、問題はありません。 。ただし、スレッドCが数値に対して+1を実行し、スレッドDが数値に対して-1を実行する場合、0と1よりも多くなります。

ロックが明確に追加されているときに負の数があるのはなぜですか?

if判決で待たされるからです。
if判定は1回だけ実行され、次のif()が実行されます。whileは常に判断しますが、while()の下のコードは、条件が満たされるまで実行されます

コードの理由:

if (number != 0){
    this.wait();//等待
}

解決策は、2か所にある場合は、代わりに置き換えることです。

while (number != 0){
    this.wait();//等待
}

以下は、誤ったウェイクアップを生成しないコードです。(falseウェイクアップを引き起こす場合はifで置き換えます)

/**
 * 虚假唤醒
 * 线程交替执行  操作同一个变量 num
 */
public class A {
    
    
    public static void main(String[] args) {
    
    
        Data data = new Data();

        new Thread(()->{
    
    
            for (int i = 0; i < 5; i++) {
    
    
                try {
    
    
                    data.increment();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
        },"A").start();

        new Thread(()->{
    
    
            for (int i = 0; i < 5; i++) {
    
    
                try {
    
    
                    data.decrement();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
        },"BB").start();

        new Thread(()->{
    
    
            for (int i = 0; i < 5; i++) {
    
    
                try {
    
    
                    data.increment();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
        },"CCC").start();

        new Thread(()->{
    
    
            for (int i = 0; i < 5; i++) {
    
    
                try {
    
    
                    data.decrement();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
        },"DDDD").start();
    }
}

//数字 资源类
class Data{
    
    
    private int number = 0;

    //执行 +1
    public synchronized void increment() throws InterruptedException {
    
    
        while (number != 0){
    
    
            this.wait();//等待
        }
        number++;
        System.out.println(Thread.currentThread().getName()+"->"+number);
        //通知其他线程,+1完毕
        this.notifyAll();
    }

    //执行 -1
    public synchronized void decrement() throws InterruptedException {
    
    
        while (number==0){
    
    
            this.wait();//等待
        }
        number--;
        System.out.println(Thread.currentThread().getName()+"->"+number);
        //通知其他线程,-1完毕
        this.notifyAll();
    }
}

おすすめ

転載: blog.csdn.net/qq_42524288/article/details/106001951