在Java中进行多线程编程时遇到IllegalMonitorStateException

时间:2016-10-13 04:22:34

标签: java multithreading wait synchronized notify

我写了一个简单的程序来学习同步块。该计划如下:

public class SychronizedBlock {

    static int balance = 0;
    static Integer lock = 0;


    public static void deposit(int amt) {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                acquire_lock();
                int holdings = balance;
                balance = holdings + amt;
                System.out.println("deposit " + amt + ", balance: " + balance);
                release_lock();
            }
        });
        t1.start();

    }

    public static void acquire_lock() {
        synchronized(lock) {
            while (lock == 1) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            lock = 1;
        }
    }

    public static void release_lock() {
        synchronized(lock) {
            lock = 0;
            lock.notifyAll();
        }
    }

    public static void test1() {
        balance = 0;
        deposit(500);
        deposit(500);
    }

    public static void main(String[] args) {
        test1();
    }
}

但是,在运行程序时,我遇到了IllegalMonitorStateException。我想我已经在synchronized块中放置了wait()和notifyAll()函数,并且我已将lock设置为synchronized参数。为什么我还有异常?

1 个答案:

答案 0 :(得分:0)

问题在于您的release_lock方法。在调用lock之前,您将0重新分配给lock.notifyAll().这意味着将在未锁定的新Integer对象上调用notifyAll。将代码更改为以下以解决问题。

public static void release_lock() {
    synchronized(lock) {            
        lock.notifyAll();
        lock = 0;
    }
}