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

查看:256
本文介绍了为什么会出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)

解决方案

这段代码全是问题啊!

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

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

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

这篇关于为什么会出java.lang.IllegalMonitorStateException异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆