JAVA_IIBRARY Telegram 1717
У тебя несколько потоков-продюсеров, которые кладут элементы в очередь, и несколько потоков-консьюмеров, которые их оттуда забирают.
Если очередь полная, продюсеры ждут.
Если очередь пустая, консьюмеры ждут.

Как реализовать такую потокобезопасную ограниченную очередь?

На первый взгляд задача простая, но на деле она проверяет, насколько хорошо ты понимаешь синхронизацию и координацию потоков.

Ответ

Мы держим фиксированного размера буфер (Deque).

Продюсеры при вызове put ждут, если буфер заполнен.

Консьюмеры при вызове take ждут, если буфер пуст.

Когда продюсер кладёт элемент, он сигналит ожидающему консьюмеру.

Когда консьюмер забирает элемент, он сигналит ожидающему продюсеру.

Ожидание всегда делается внутри while, чтобы поток после пробуждения перепроверил условие.

Флаг close запрещает новые вставки и будит всех, чтобы они завершились корректно.

Предпочтительный способ это использовать ReentrantLock. Это как synchronized, только с большим контролем. Один и тот же поток может захватить его несколько раз без дедлока. Он позволяет создавать Condition-объекты — это очереди ожидания, привязанные к замку. Здесь удобно завести две: notFull и notEmpty, чтобы продюсеры и консьюмеры ждали и сигналили точно по ситуации.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3🌭21👀1



tgoop.com/Java_Iibrary/1717
Create:
Last Update:

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

Как реализовать такую потокобезопасную ограниченную очередь?

На первый взгляд задача простая, но на деле она проверяет, насколько хорошо ты понимаешь синхронизацию и координацию потоков.

Ответ

Мы держим фиксированного размера буфер (Deque).

Продюсеры при вызове put ждут, если буфер заполнен.

Консьюмеры при вызове take ждут, если буфер пуст.

Когда продюсер кладёт элемент, он сигналит ожидающему консьюмеру.

Когда консьюмер забирает элемент, он сигналит ожидающему продюсеру.

Ожидание всегда делается внутри while, чтобы поток после пробуждения перепроверил условие.

Флаг close запрещает новые вставки и будит всех, чтобы они завершились корректно.

Предпочтительный способ это использовать ReentrantLock. Это как synchronized, только с большим контролем. Один и тот же поток может захватить его несколько раз без дедлока. Он позволяет создавать Condition-объекты — это очереди ожидания, привязанные к замку. Здесь удобно завести две: notFull и notEmpty, чтобы продюсеры и консьюмеры ждали и сигналили точно по ситуации.

👉 Java Portal

BY Java Portal | Программирование




Share with your friend now:
tgoop.com/Java_Iibrary/1717

View MORE
Open in Telegram


Telegram News

Date: |

As of Thursday, the SUCK Channel had 34,146 subscribers, with only one message dated August 28, 2020. It was an announcement stating that police had removed all posts on the channel because its content “contravenes the laws of Hong Kong.” So far, more than a dozen different members have contributed to the group, posting voice notes of themselves screaming, yelling, groaning, and wailing in various pitches and rhythms. To upload a logo, click the Menu icon and select “Manage Channel.” In a new window, hit the Camera icon. bank east asia october 20 kowloon 1What is Telegram Channels?
from us


Telegram Java Portal | Программирование
FROM American