题目描述

两个线程,一个线程取钱,一个线程存钱。

当余额不足时,取钱线程暂停取钱。

存钱线程存完钱后,唤醒取钱线程。

代码

使用ReentrantLock,和Condition的await,signal,signalAll

public class Demo {
    volatile double money = 50;
    Lock lock = new ReentrantLock(); // 新建一个Lock
    Condition condition = lock.newCondition(); // new一个lock的condition

    // 取钱
    public void fitch() throws InterruptedException {
        lock.lock(); // 获取锁
        // 钱小于50,等待
        while (money < 30) {
            System.out.println("取 30:余额不足 = " + money);
            condition.await();
        }
        money -= 30;
        System.out.println("取 30:余额 = " + money);
        Thread.sleep(3000); // 为了观看效果
        lock.unlock(); // 释放锁
    }

    // 存钱
    public void reserve() throws InterruptedException {
        lock.lock(); // 获取锁
        money += 30;
        System.out.println("存 30:余额 = " + money);
        Thread.sleep(3000); // 为了观看效果
        condition.signalAll(); // 通知取钱线程
        lock.unlock(); // 释放锁
        Thread.sleep(5); // 为了更好的观看效果,睡5毫秒让取钱线程执行取钱操作
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        // 取钱线程
        Thread fitch = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    demo.fitch();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 存钱线程
        Thread reserve = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    demo.reserve();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        fitch.start();
        reserve.start();
    }
}