开发者社区 问答 正文

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

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)

展开
收起
蛮大人123 2016-03-11 13:43:59 4868 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    这段代码全是问题啊!
    启动线程应该使用start方法,直接调用run方法不会创建新的线程
    一个线程只能释放它自己的锁,不能释放别的线程的锁
    一个线程调用了n次lock,那么它最多也只能调用n次unlock

    2019-07-17 18:59:04
    赞同 展开评论
问答标签:
问答地址: