1. LinkedBlockingQueue (Thực hiện LinkedList nhưng không chính xác JDK Thực hiện LinkedList Nó sử dụng tĩnh lớp bên trong Node để duy trì Liên kết giữa các yếu tố) lớp
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 Được sử dụng để duy trì Liên kết
static class Node<E> {
E item;
Node<E> next;
Node(E x) { item = x; }
}
2. ArrayBlockingQueue (Mảng thực hiện)
Constructor cho 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();
}
IMHO khác biệt lớn nhất giữa ArrayBlockingQueue và LinkedBlockingQueue là rõ ràng từ constructor người ta cơ bản cấu trúc dữ liệu mảng và LinkedList khác.
ArrayBlockingQueue sử dụng single-lock double condition algorithm và LinkedBlockingQueue là biến thể của "hai khóa đợi" thuật toán và nó có 2 ổ khóa 2 điều kiện (takeLock, putLock)
Đến bây giờ tôi đã so sánh giữa những 2 triển khai Trở lại câu hỏi ban đầu, Câu hỏi tương tự đã được hỏi trong concurrency mailing list trong cuộc đàm phán này doug Lea về DynamicArrayBlockingQueue đó là implementation provided by Dawid Kurzyniec.
Danh sách mảng sẽ không cải thiện hiệu suất ... Tại sao phải không? Và bên cạnh đó: tại sao bạn lo lắng về hiệu suất? Bạn có thực sự có vấn đề? Bạn có hồ sơ? – Dariusz
Tôi đang nghĩ về địa phương bộ nhớ. Nếu bạn sử dụng danh sách được liên kết có các yếu tố nhảy xung quanh các địa chỉ bộ nhớ ngẫu nhiên, bạn sẽ dễ bị mất bộ nhớ cache và các vấn đề tương tự.Thêm vào đó, để lấy từ bộ nhớ, bạn phải lấy địa chỉ của phần tử tiếp theo, rồi lấy nội dung của địa chỉ đó ... Trong khi đó, với một mảng, bạn chỉ cần làm địa chỉ ++ để lấy địa chỉ của phần tử tiếp theo. Với một danh sách các mảng, bạn sẽ có một số thỏa hiệp giữa hai việc triển khai ... Bạn có nghĩ khác không? –
Tôi nghĩ rằng một danh sách các mảng cung cấp cho bạn những lợi thế từ cả hai bộ sưu tập gốc. Bạn vẫn phải phân bổ bộ nhớ và, tùy thuộc vào kích thước của mảng, nó sẽ bị phân mảnh nhiều hơn hoặc ít hơn. Tôi nghĩ rằng nếu bạn làm cho thuật toán thay đổi kích thước bộ sưu tập dựa trên Array của bạn, bạn sẽ có vài thay đổi kích thước và lặp lại rất nhanh. Đối với bộ nhớ cục bộ - các bộ sưu tập lưu trữ các tham chiếu đến các đối tượng và các đối tượng đó có thể được đặt ở bất kỳ vị trí nào trong bộ nhớ, vì vậy bạn có thể sẽ không nhận được lợi ích từ việc sử dụng một bộ sưu tập này. – Dariusz