Пример простейшего многопоточного ограниченного буфера с использованием ReentrantLock:
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class BoundedBuffer<T> {
private int capacity;
private Queue<T> buffer;
private ReentrantLock lock;
private Condition notFullCondition;
private Condition notEmptyCondition;
public BoundedBuffer(int capacity) {
this.capacity = capacity;
this.buffer = new LinkedList<>();
this.lock = new ReentrantLock();
this.notFullCondition = lock.newCondition();
this.notEmptyCondition = lock.newCondition();
}
public void put(T element) throws InterruptedException {
lock.lock();
try {
while (buffer.size() == capacity) {
notFullCondition.await();
}
buffer.offer(element);
notEmptyCondition.signalAll();
} finally {
lock.unlock();
}
}
public T take() throws InterruptedException {
lock.lock();
try {
while (buffer.isEmpty()) {
notEmptyCondition.await();
}
T element = buffer.poll();
notFullCondition.signalAll();
return element;
} finally {
lock.unlock();
}
}
}
В этой реализации используется класс ReentrantLock для обеспечения синхронизации и взаимодействия между потоками. Класс Condition используется для определения условий ожидания и оповещения.
Метод put(T element) добавляет элемент в буфер. Если буфер заполнен, вызывающий поток блокируется с помощью await() на условии notFullCondition, пока не появится место в буфере. Когда элемент успешно добавлен, другие потоки, которые могут ждать освобождения буфера, будут оповещены с помощью signalAll() на условии notEmptyCondition.
Метод take() извлекает элемент из буфера. Если буфер пуст, вызывающий поток блокируется с помощью await() на условии notEmptyCondition, пока в буфере не появится элемент. Когда элемент успешно извлечен, другие потоки, которые могут ждать добавления элемента в буфер, будут оповещены с помощью signalAll() на условии notFullCondition.
Обратите внимание, что блокировки с использованием lock() и unlock() должны быть обернуты в конструкцию try-finally, чтобы гарантировать правильное освобождение блокировки даже в случае исключения.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov