Проблема производителя с потребителем отображает неправильный заказ

Следующий код производителя-потребителя отображает неправильный порядок (до того, как производитель произведет потребительский продукт. Иногда производитель производит много предметов (ячейка разрешает только один предмет)). это почему?

  public class CubbyHole {
    private int content;
    private boolean available=false;

   public synchronized int get() {
      while (available == false) {
         try {
            wait();
         } catch (InterruptedException e) {}
      }
      available = false;
      notify();
      return content;
   }
   public synchronized void put(int value) {
      while (available == true) {
         try {            
            wait();
         } catch (InterruptedException e) { } 
      }
      content = value;
      available = true;
      notifyAll();
      }
   } 

public class Consumer extends Thread {
    CubbyHole c;

    public Consumer(CubbyHole c){
        this.c=c;
    }

    public void run(){
        int val=0;
        for(int i =0;i<10;i++){
            val=c.get();
            System.out.println("consumer gets "+val);
        }
    }

}

public class Producer extends Thread {
    CubbyHole c;

    public Producer(CubbyHole c){
        this.c=c;
    }
    public void run(){
        for(int i=0;i<10;i++){
            c.put(i);
            System.out.println("Producer puts "+i);
        }

    }

}
public class Dimo {

    public static void main(String[] args) {
        CubbyHole c = new CubbyHole();
        Producer p = new Producer(c);
        Consumer con = new Consumer(c);
        p.start();
        con.start();

    }
}

этот код получает следующий вывод

Producer puts 0
Producer puts 1
consumer gets 0
consumer gets 1
Producer puts 2
Producer puts 3
consumer gets 2
consumer gets 3
Producer puts 4
consumer gets 4
consumer gets 5
Producer puts 5
Producer puts 6
consumer gets 6
Producer puts 7
Producer puts 8
consumer gets 7
consumer gets 8
Producer puts 9
consumer gets 9

может кто-нибудь объяснить, что не так с этим кодом? как получить правильный порядок в этом коде?

Определите правильный порядок. Мне кажется, вы печатаете без ограничений.

Boris the Spider 26.11.2018 14:43

@JoakimDanielson, который уже используется семафором boolean. Проблема заключается в гонке за данными в печати.

Boris the Spider 26.11.2018 14:48

@BoristheSpider the Spider, это тот порядок, который я хочу, чтобы производитель размещал 0 потребителей получает 0 производитель размещает 1 потребитель получает 1 производитель размещает 2 потребителя получает 2 производитель размещает 3 потребителя получает 3 .... и т. д.

Gayan Jayakody 26.11.2018 14:50

Вам нужно будет печатать внутри замка, чтобы предотвратить чередование.

Boris the Spider 26.11.2018 14:54

@BoristheSpider Большое спасибо. оно работает

Gayan Jayakody 26.11.2018 14:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отметьте эти две строки:

val=c.get();
System.out.println("consumer gets "+val);

Что может случиться, так это то, что потребитель звонит в каморку и ждет там, пока она свободна. Затем он получает значение и выпускает его. Теперь между этими двумя строками - после c.get () и перед printlin другой поток может завершить весь свой процесс - вызовите put (i) и print. Тогда вы получите два значения Producer.put ().

Вы должны переместить печатную часть внутрь кода ячейки, чтобы убедиться, что она печатает то, что вы хотите.

Другие вопросы по теме