** 功能:四个线程交替打印输出
问题:开始运行后如果两个线程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();
}
}