sinat_42457748
青一叶舟
2019-09-27 16:17
采纳率: 100%
浏览 1.4k
已采纳

萌新提问,为什么我的会报java.lang.IllegalMonitorStateException这个错误?

package bank;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class BankThread {

    // 定义money变量
    private int money;
    // 定义锁对象
    private Lock lock = new ReentrantLock();

    public BankThread(int money) {
        super();
        this.money = money;
    }

    public void stock() {
        lock.lock();
        try {

            if (money > 500) {
                try {
                    wait();
                    notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                // 每次调用存入100元
                money += 100;
                System.out.println("妈妈存进了100元,现在还有" + money + "元");

                // 唤醒儿子
                if (money > 200) {
                    this.notify();
                }

            }
        } finally {
            lock.unlock();
        }
    }

    public void spend() {

        lock.lock();
        try {
            if (money < 200) {
                try {
                    wait();
                    notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                // 每次取100块钱
                money -= 100;
                System.out.println("儿子取走了100元,现在还有" + money + "元");
                if (money < 200) {
                    this.notify();
                }
            }
        } finally {
            lock.unlock();
        }
    }

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2019-09-28 10:11
    已采纳

    wait 和 notify 方法的调用必须具有内置锁 synchronized(this) 的代码块内才能调用,否则就会报该错误。
    这里既然用了显式锁 Lock 就不要用 wait 和 notify 了,它们是两套加锁机制,不能混着用的。应该用 lock 创建一个 Condition ,然后在该 Condition 上 Wait。
    参考

    点赞 评论
  • renkai721
    renkai721 2019-09-27 16:51

    参考下这个文章,应该容易懂。
    https://blog.csdn.net/u013958151/article/details/87856252

    点赞 评论
  • LM5463640
    请叫我七点起床 2019-09-30 11:34
    public class BankThread {
    
        private Integer money = 0;
        private Object object = new Object();
    
        public static void main(String[] args) {
            BankThread bankThread = new BankThread();
            new Thread(() -> bankThread.stock()).start();
            new Thread(() -> bankThread.spend()).start();
    
        }
    
        public void stock() {
            while(true){
                synchronized (object) {
                    if(money > 500){
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            object.notify();
                        }
                    }else{
                        // 每次调用存入100元
                        money += 100;
                        System.out.println("妈妈存进了100元,现在还有" + money + "元");
                        // 唤醒儿子
                        object.notify();
                    }
                }
            }
        }
    
        public void spend() {
            while(true){
                synchronized (object) {
                    if(money < 200){
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            object.notify();
                        }
                    }else {
                        // 每次取100块钱
                        money -= 100;
                        System.out.println("儿子取走了100元,现在还有" + money + "元");
                        object.notify();
                    }
                }
            }
        }
    }
    
    

    wait,notify要配合synchronized使用
    await,signal配合Condition c = lock.newCondition()使用。
    上述代码是根据synchronized写的,synchronized不要锁money,因为是Integer类型,超过-128~127的时候,
    每次都是新对象,会报你所说的错误。这里新建一个object类型。

    点赞 评论

相关推荐