同步块锁定在类[重复]上。

问题描述 投票:1回答:1

在下面的生产者和消费者的代码中,我认为生产()和消费()方法是在类锁(Processor.class)上同步的,但我得到了一个异常说明IllegalMonitorStateException,它发生在我们没有获得锁的对象上,但我们通知该对象。

谁能告诉我,我在程序中哪里出了问题。

package ProducerConsumer;
    public class Main {
        public static void main(String[] args) {

            Processor processor = new Processor();

            Thread producer = new Thread(new Runnable() {
                public void run() {
                    try {
                        processor.produce();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });

            Thread consumer = new Thread(new Runnable() {
                public void run() {

                    try {
                        processor.consume();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            System.out.println("\t\t\tStarting both producer and consumer Threads.");
            producer.start();
            consumer.start();

            try {
                producer.join();
                consumer.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("\t\t\tEnding all the Threads.");
        }
    }


    import java.util.List;
    import java.util.ArrayList;

    public class Processor {
        private List<Integer> list = new ArrayList<>();
        private int value = 0;
        private final int LIMIT = 5;

        public void produce() throws InterruptedException
        {
            synchronized(Processor.class){
                while(true)
                {
                    if(list.size() == LIMIT){
                            System.out.println("Waiting for consumer to consume resources");
                            wait();
                    }
                    else{
                        value++;
                        System.out.println("The produced resource is : "+value);
                        list.add(value);
                        notify();
                    }
                }
            }
        }

        public  void consume() throws InterruptedException
        {
            synchronized(Processor.class){
                while(true)
                {
                    if(list.isEmpty()){
                            System.out.println("Waiting for producer to produce the resources");
                            wait();
                    }
                    else{
                        System.out.println("The consumer Consumed Resource is : "+list.remove(0));
                        notify();
                    }
                }
            }
        }
    }
java synchronized synchronized-block
1个回答
0
投票

你的 wait() & notify() 上被调用。thisProcessor processor = new Processor(); 但你的锁定同步在 Processor.class 对象。你可以将你的代码修改成如下的工作方式。

class Processor {
    private List<Integer> list = new ArrayList<>();
    private int value = 0;
    private final int LIMIT = 5;

    public void produce() throws InterruptedException
    {
        synchronized(Processor.class){
            while(true)
            {
                if(list.size() == LIMIT){
                    System.out.println("Waiting for consumer to consume resources");
                    Processor.class.wait();
                }
                else{
                    value++;
                    System.out.println("The produced resource is : "+value);
                    list.add(value);
                    Processor.class.notify();
                }
            }
        }
    }

    public  void consume() throws InterruptedException
    {
        synchronized(Processor.class){
            while(true)
            {
                if(list.isEmpty()){
                    System.out.println("Waiting for producer to produce the resources");
                    Processor.class.wait();
                }
                else{
                    System.out.println("The consumer Consumed Resource is : "+list.remove(0));
                    Processor.class.notifyAll();
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.