【java并发编程】会合模式

304 阅读1分钟

会合模式

会合模式其实就是信号模式的推广。第一个任务将等待第二个任务的某一事件,而第二个任务又在等待第一个任务的某一事件。解决方案与信号模式非常相似,只不过使用的对象不再是一个,而是两个。

我想了一下,转账操作不就可以使用会合模式吗!说干就干,上代码

/**
 * @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........