notifyAll方法只会通知wait状态的线程吗

** 功能:四个线程交替打印输出

问题:开始运行后如果两个线程B(backupB1,backupB2)都进入wait状态后,一个线程A(backupA1)获得锁并执行完毕后进行nofityAll操作,如果通知的是另一个线程A 那么不是另外两个线程B会一直wait下去?
所以想问下notifyAll方法只会通知wait状态的线程还是会连等待进入同步代码块的线程一起通知。即wait状态的线程和等待进入同步代码块的线程进行锁竞争**

功能代码类

    public class DBTools {

volatile private boolean prevIsA = false;

synchronized public  void backupA() {
    try {
        while (prevIsA == true) {
            wait();
        }
        for (int i = 0; i < 5; i++) {
            System.out.println("☆☆☆☆☆");
        }
        prevIsA = true;
        notifyAll();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

synchronized public  void backupB() {
    try {
        while (prevIsA == false) {
            wait();
        }
        for (int i = 0; i < 5; i++) {
            System.out.println("△△△△△");
        }
        prevIsA = false;
        notifyAll();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

线程A

public class BackupA extends Thread{

private DBTools dbTools;

public BackupA(DBTools dbTools) {
    super();
    this.dbTools = dbTools;
}

@Override
public void run() {
    dbTools.backupA();
}

}

线程B

public class BackupB extends Thread{
private DBTools dbTools;

public BackupB(DBTools dbTools) {
    super();
    this.dbTools = dbTools;
}

@Override
public void run() {
    dbTools.backupB();
}

}

测试类

public class RunBackup {
public static void main(String[] args) {
    DBTools dbTools = new DBTools();
    BackupB backupB1 = new BackupB(dbTools);
    backupB1.start();
    BackupB backupB2 = new BackupB(dbTools);
    backupB2.start();
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    BackupA backupA1 = new BackupA(dbTools);
    backupA1.start();
    BackupA backupA2 = new BackupA(dbTools);
    backupA2.start();
}

}

所有线程竞争资源.不用纠结是否wait.

如果通知的是另一个线程A 那么不是另外两个线程B会一直wait下去?这个可能会发生。因为唤醒线程是随机的,有可能发生你说的这种情况。针对你下面说的问题,notify只会唤醒等待池中的某一个线程,但是不确定是哪一个线程,notifyAll是针对指定对象里面的所有线程执行唤醒操作,指定对象一旦唤醒成功。则会立即加入线程的资源争夺中去。也就是楼上的解释。还望采纳。