java.lang.IllegalMonitorStateException异常

2021/9/6 1:07:07

本文主要是介绍java.lang.IllegalMonitorStateException异常,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在编写三个线程轮流打印1-100时,爆出了许多java.lang.IllegalMonitorStateException异常(非法的锁状态),经过摸索了解到是
condition1.await()要在Lock锁里面
同理wait要在Synchronized里
这里附上代码

class Count{
    static int number = 0;
    private int flag=1;
    ReentrantLock reentrantLock = new ReentrantLock();
    Condition condition1 = reentrantLock.newCondition();
    Condition condition2 = reentrantLock.newCondition();
    Condition condition3 = reentrantLock.newCondition();


    public void add1(){
    //这里由于粗心导致写成reentrantLock.newCondition(),导致 锁状态 异常
        reentrantLock.lock();
        try {
            while (flag != 1){
                condition1.await();
            }
            if (number<=100){
            System.out.println(Thread.currentThread().getName()+"    "+number);
            number++;}
            flag=2;
            condition2.signal();

        }catch (InterruptedException e){
            e.toString();
        }finally {

            reentrantLock.unlock();
        }
    }
    public void add2(){
        reentrantLock.lock();
        try {
            while (flag !=2){
                condition2.await();
            }
            if (number<=100){
            System.out.println(Thread.currentThread().getName()+"    "+number);
            number++;}
            flag=3;
            condition3.signal();

        }catch (InterruptedException e){
            e.toString();
        }finally {

            reentrantLock.unlock();
        }
    }

    public void add3(){
        reentrantLock.lock();
        try {
            while (flag !=3){
                condition3.await();
            }if (number<=100)
            System.out.println(Thread.currentThread().getName()+"    "+number);
            number++;

            flag=1;
            condition1.signal();

        }catch (InterruptedException e){
            e.toString();
        }finally {

            reentrantLock.unlock();
        }
    }
}
public class Study {

    public static void main(String[] args) {
        Count count = new Count();
        while (count.number <= 100) {

            new Thread(() -> {
                count.add1();
            }, "A").start();

            new Thread(() -> {
                count.add2();
            }, "B").start();

            new Thread(() -> {
                count.add3();
            }, "C").start();


        }
    }
}



这篇关于java.lang.IllegalMonitorStateException异常的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程