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

发布于 2022-09-02 09:35:07 字数 1838 浏览 16 评论 0

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苍白女子 2022-09-09 09:35:07

这段代码全是问题啊!

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

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

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

九公里浅绿 2022-09-09 09:35:07

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

  1. 主线程 lock2.lock

  2. thread1 run 此时 i=1 跳过

  3. thread2 运行 lock2.lock lock1.unlock

还没有lock的情况下就unlock

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文