为什么会出java.lang.IllegalMonitorStateException异常?
怪我咯
怪我咯 2017-04-17 17:14:14
[Java讨论组]
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)
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHPz

这段代码全是问题啊!

  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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号