飞翔的都江堰人 2018-10-25 15:33 采纳率: 0%
浏览 748

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();
}

}

  • 写回答

2条回答 默认 最新

  • Galway? 2018-10-25 15:49
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型