Использование явной блокировки для предотвращения взаимоблокировки дает исключение

я пытаюсь сделать здесь общий ресурс, то есть SharedResource777.java, этот класс имеет два метода doIt () и setBFlag (), оба потока получают Lock и выполняют метод, используя поток.

код такой, как показано ниже,

    import java.util.concurrent.locks.*;

    class SharedResource777{
        private boolean bFLag = false;
        private Lock lockObj = new ReentrantLock();
        private Condition condition = lockObj.newCondition();

        public void doIt() {        
            try{
                lockObj.lock();         
                while(!bFLag){
                    System.out.println(" THE THREAD "+Thread.currentThread().getName());            
                    condition.wait();
                }           
            }catch(Exception e){
                System.out.println(e);
            }finally{
                lockObj.unlock();
            }           
        }

        public void setBFlag(boolean bFLag){        
            try{
                lockObj.lock(); 
                this.bFLag = bFLag;     
                System.out.println(" THE THREAD "+Thread.currentThread().getName()+" ["+this.bFLag+"]");
                condition.signal();
            }catch(Exception e){
                System.out.println(e);
            }finally{
                lockObj.unlock();
            }
        }

    }

    class MyThread620 extends Thread{

        private SharedResource777 resource;

        MyThread620(String threadName,SharedResource777 resource){
            super(threadName);
            this.resource = resource;
        }

        @Override
        public  void run(){
            resource.doIt();            
        }
    }

    class MyThread621 extends Thread{

        private SharedResource777 resource;

        MyThread621(String threadName,SharedResource777 resource){
            super(threadName);
            this.resource = resource;
        }

        @Override
        public  void run(){
            resource.setBFlag(true);                    
        }
    }



    public class Ex11{
        public static void main(String [] args){
            SharedResource777 obj777 = new SharedResource777();
            MyThread620 t620 = new MyThread620("TROY",obj777);
            MyThread621 t621 = new MyThread621("HECTOR",obj777);
            t620.start();
            t621.start();
        }
    }

Здесь происходит следующее: в командной строке первая строка - «THREAD TROY», вторая строка - "java.lang.IllegalMonitorStateException", третья строка - «THREAD HECTOR [true]»,

, и программа завершается.

Я пытался сделать то, что поток T1 выполнит doIt (), который, в свою очередь, получит блокировку, затем войдет в цикл while, распечатает ожидание SOP, которое освободит блокировку.

После того, как поток t2 получает блокировку в методах setBFlag () и signal (), т.е. уведомляет () другому потоку о том, что он снял блокировку,

t1 снова получит блокировку и из-за изменения флага прерывает это время. цикл, снимает блокировку в блоке finally.

Но в моем сценарии я получаю исключение,

Не могли бы вы сказать мне, где я пропал,

Где я ошибаюсь

0
задан Rahul Shivsharan 10 February 2012 в 15:42
поделиться