为什么会出java.lang.IllegalMonitorStateException异常?

package threadExam;

import java.util.concurrent.locks.ReentrantLock;

class Thread1 extends Thread {
    private ReentrantLock lock1;
    private ReentrantLock lock2;
    public Thread1(ReentrantLock lock1, ReentrantLock lock2)
    {
        this.lock1 = lock1;
        this.lock2 = lock2;
    }
    public void run()
    {
        for (int i = 1; i <=52; i++) 
        {
            System.out.print(i);
            if (i % 2 == 0) {
                lock1.lock();
                lock2.unlock();
            }
        }
    }
}

class Thread2 extends Thread {
    private ReentrantLock lock1;
    private ReentrantLock lock2;
    public Thread2(ReentrantLock lock1, ReentrantLock lock2)
    {
        this.lock1 = lock1;
        this.lock2 = lock2;
    }
    public void run()
    {
        for (int i = 0; i < 26; i++)
        {
            System.out.print((char)(i + 'A'));
            lock2.lock();
            lock1.unlock();            
        }
    }
}

public class Exam1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ReentrantLock lock1 = new ReentrantLock();
        ReentrantLock lock2 = new ReentrantLock();
        Thread t1 = new Thread1(lock1, lock2);
        Thread t2 = new Thread2(lock1, lock2);
        lock2.lock();
        t1.run();
        t2.run();
    }
 
}

运行后报错提示:

Exception in thread "main" java.lang.IllegalMonitorStateException
    at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
    at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
    at threadExam.Thread1.run(Exam1.java:30)
    at threadExam.Exam1.main(Exam1.java:67)
阅读 8.1k
2 个回答

这段代码全是问题啊!

  1. 启动线程应该使用start方法,直接调用run方法不会创建新的线程

  2. 一个线程只能释放它自己的锁,不能释放别的线程的锁

  3. 一个线程调用了n次lock,那么它最多也只能调用n次unlock

程序在运行时可能出现如下情况

  1. 主线程 lock2.lock

  2. thread1 run 此时 i=1 跳过

  3. thread2 运行 lock2.lock lock1.unlock

还没有lock的情况下就unlock

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进