会合模式
会合模式其实就是信号模式的推广。第一个任务将等待第二个任务的某一事件,而第二个任务又在等待第一个任务的某一事件。解决方案与信号模式非常相似,只不过使用的对象不再是一个,而是两个。
我想了一下,转账操作不就可以使用会合模式吗!说干就干,上代码
/**
* @author xuxi
* @date 2021/8/5
* @desciption
**/
public class RendezvousPattern {
public static void main(String[] args) {
MoneySender moneySender = new MoneySender();
MoneyReceiver moneyReceiver = new MoneyReceiver();
Thread t1 = new Thread(() -> {
synchronized (moneySender) {
System.out.println("t1向t2转账100块,t1余额:" + moneySender.getMoney() + " t2余额:" + moneyReceiver.getMoney());
synchronized (moneyReceiver) {
System.out.println("喊t2起来收钱,t1等待收钱信息");
//唤醒t2,t1等待
moneyReceiver.notify();
}
try {
//t1进行等待
moneySender.wait();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
moneySender.setMoney(0);
System.out.println("转账成功! t1余额:" + moneySender.getMoney() + " t2余额:" + moneyReceiver.getMoney());
}
}
});
Thread t2 = new Thread(() -> {
synchronized (moneyReceiver) {
try {
//t2先等到别个t1把钱输了来,莫慌
System.out.println("t2先等到别个t1把钱输了来,莫慌");
moneyReceiver.wait();
synchronized (moneySender) {
Thread.sleep(2000);
//跟t1说我钱收到了
System.out.println("跟t1说我钱收到了");
moneyReceiver.setMoney(100);
moneySender.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
class MoneySender {
int money = 100;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
class MoneyReceiver {
int money = 0;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
执行结果
在码这个代码的时候,遇到了死锁。原因是我让moneySender先wait了,没有唤醒moneyReceiver........