notify () против notifyAll ()?

1

Я наткнулся на Java: notify() vs. notifyAll() снова и снова, но все равно не мог устоять сам.

xagyg объяснил это очень хорошо, но в итоге стало очень сложно запомнить концепцию.

Я стараюсь изо всех сил здесь, используя простой пример повседневной жизни, чтобы я и другие могли вернуться к этому, если кто-нибудь забудет. Мой источник понимания - это ответ xagyg в приведенной выше ссылке, но мы стараемся просто понять, что здесь происходит.

Скажите, что двое парней отправились в кинотеатр и нашли свой дом. Но тогда парень из кассы сказал, что Джон сказал им, что есть билет, который был зарезервирован для президента. Если он не придет, он продаст его. Тогда ребята сказали jon, хорошо, мы ждем в отеле рядом, пожалуйста, сообщите нам, когда вы получите информацию. Эти парни ходят в отель и спят. Теперь президент не появляется, теперь у Джона есть два варианта. Сначала уведомляет одного из парней и позволяет другому спать. Если он сделает это, можно пойти в кино, в то время как другие, вероятно, продолжат спать (пока он не получит уведомление. Я предполагаю, что этот парень не спал целый год :)). Другим вариантом является то, что он уведомляет (пробуждает) оба из них, выбирает любой из них (в программе примера java не выбирается, а его vm/thread scheduler) для фильма. В этом случае он будет держать другого парня в гостиничном номере, поскольку он может создайте какие-то проблемы :( Теперь, когда шоу заканчивается, этот парень может пойти на следующее шоу, если билет доступен. Рассмотрите билет как замок, театр как объект. Это то, что точно уведомляет и уведомляет об этом. Таким образом, ясно, что notifAll лучше уведомлять, когда в замешательстве

Теперь рассмотрим пример производителя/потребителя.

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

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

Дай мне знать, правильно ли я понял?

Теги:
multithreading

1 ответ

0

Я не думаю, что то, что вы написали в последнем утверждении, верно. Каждый раз, когда производитель создает объект, он должен уведомлять потребителя, поэтому, если 2 объекта созданы, он должен вызывать уведомление дважды, а не один раз. Таким образом, если вы используете notify вместо notifyAll, вы все равно сможете получить как потребительские потоки, чтобы потреблять

  • 0
    Я согласен. Я просто попытался создать сценарий, в котором notifyAll имеет преимущество над уведомлением.
  • 0
    Примите ответ :) Да, я не думаю, что это возможно, если вы следуете традиционному производителю-потребителю. Если из-за проблемы вы можете производить пакетное производство, а затем уведомлять, вы можете получить преимущество с помощью notifyAll, но это зависит от ситуации, а не от первоначальной формулировки проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню