等待/通知之交叉备份问题记录

等待/通知之交叉备份问题记录

题目:创建20个线程,其中10个线程是将数据备份到A数据库中,另外10个线程将数据备份到B数据库中,并且备份A数据库和B数据库是交叉进行的。
  首先创建出20个线程,效果如图3-41所示。
  通过一些手段将这20个线程的运行效果变成有序的,如图3-42所示。

public class DBTools {
//确保备份数据库A首先执行
private volatile boolean prevIsA = false;

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

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

}

public class BackupA extends Thread {
private DBTools dbTools;

public BackupA(DBTools dbTools) {
    this.dbTools = dbTools;
}
public void run() {
    dbTools.backupA();
}

}
public class BackupB extends Thread {
private DBTools dbTools;

public BackupB(DBTools dbTools) {
    this.dbTools = dbTools;
}
public void run() {
    dbTools.backupB();
}

}

public class Run {
public static void main(String[] args) throws InterruptedException {
DBTools dbTools = new DBTools();
for (int i=0; i<20; i++) {
BackupB output = new BackupB(dbTools);
output.start();
BackupA input = new BackupA(dbTools);
input.start();
}
}
}

+++++
+++++
+++++
+++++
+++++
^^^^^
^^^^^
^^^^^
^^^^^
^^^^^
+++++
+++++
+++++
+++++
+++++
^^^^^
^^^^^
^^^^^
^^^^^
^^^^^
……
打印的效果是交替运行的。
  交替打印的原理就是使用如下代码作为标记:
  private boolean volatile prevIsA = false;
  实现了A和B线程交替备份的效果

代码是这样的,有些不解的是为什么会是这样有顺序的?
一开始prevIsA是false那么所有的backA线程会走,不用wait,然后10个线程会抢,不是有可能会出现打印乱的情况么?为什么这里会是顺序的,希望能找到回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值