Ответ 1
1. LinkedBlockingQueue (реализация LinkedList, но не реализация JDK LinkedList Использует статический внутренний класс Node для поддержания связей между элементами)
Constructor for LinkedBlockingQueue
public LinkedBlockingQueue(int capacity)
{
if (capacity < = 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node< E >(null); // Maintains a underlying linkedlist. ( Use when size is not known )
}
Node класс, используемый для ведения ссылок
static class Node<E> {
E item;
Node<E> next;
Node(E x) { item = x; }
}
2. ArrayBlockingQueue (реализация массива)
Конструктор для ArrayBlockingQueue
public ArrayBlockingQueue(int capacity, boolean fair)
{
if (capacity < = 0)
throw new IllegalArgumentException();
this.items = new Object[capacity]; // Maintains a underlying array
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
ИМХО Самая большая разница между ArrayBlockingQueue и LinkedBlockingQueue понятна из конструктора, у которого есть базовая структура данных Array и другие связанныеList.
ArrayBlockingQueue использует алгоритм двойного условия с одним замком, а LinkedBlockingQueue - это вариант алгоритма "две очереди блокировки" и имеет 2 условия блокировки 2 (takeLock, putLock)
До сих пор я дал сравнение между этими двумя реализациями. Возвращаясь к оригинальному вопросу. Аналогичный вопрос был задан в concurrency почтовый список в этом doug Lea рассказывает о DynamicArrayBlockingQueue, который является реализацией, предоставленной Давидом Курзинеком.