Я реализую потокобезопасную очередь с ограниченной блокировкой. Есть два способа, которыми я могу придумать это.
Подход 1 :
class BoundedBlockingQueue {
int capacity;
Queue<Integer> queue;
public BoundedBlockingQueue(int capacity) {
this.capacity = capacity;
this.queue = new LinkedList();
}
public void enqueue(int element) throws InterruptedException {
while(queue.size() == capacity);
queue.add(element);
}
public int dequeue() throws InterruptedException {
while(queue.size() == 0);
return queue.remove();
}
public int size() {
return queue.size();
}
}
Здесь, во время постановки в очередь, процесс будет продолжать цикл цикла while (обратите внимание на немедленный ;
сразу после условия while)и продолжайте работу только тогда, когда queue.size () станет меньше емкости. Аналогичная логика существует для удаления из очереди, когда queue.size () равняется 0.
Второй способ создать то же самое - использовать ключевое слово synchronized
, как показано ниже:
Подход 2 :
class BoundedBlockingQueue {
int capacity;
Queue<Integer> queue;
public BoundedBlockingQueue(int capacity) {
this.capacity = capacity;
this.queue = new LinkedList();
}
public void enqueue(int element) throws InterruptedException {
synchronized(queue){
while(queue.size() == capacity) queue.wait();
queue.add(element);
queue.notifyAll();
}
}
public int dequeue() throws InterruptedException {
synchronized(queue){
while(queue.size() == 0) queue.wait();
int val = queue.remove();
queue.notifyAll();
return val;
}
}
public int size() {
return queue.size();
}
}
Здесь мы заставляем процесс ждать тех же ситуаций, и он продолжается только тогда, когда другой процесс уведомляет об этом. Единственное отличие состоит в том, что мы используем ключевое слово synchronized
здесь, в подходе 2, но в подходе 1 мы не используем его.
Наблюдение состоит в том, что подход 1 занимает значительно больше времени выполнения, чем подход 2. Почему это так? Разве основная логика обоих подходов не одинакова? Почему для подхода 1 требуется больше времени выполнения по сравнению с подходом 2?
Любая помощь будет высоко оценена.