2010-10-26 29 views

Trả lời

5

Kích thước của ConcurrentLinkedQueue là không bị chặn, vì vậy nếu nhà sản xuất đưa vật phẩm nhanh hơn người tiêu dùng có thể loại bỏ chúng, cuối cùng nó sẽ ăn hết bộ nhớ của bạn. Nếu bạn muốn giới hạn kích thước của hàng đợi, hãy thử một hàng đợi chặn, chẳng hạn như LinkedBlockingQueue hoặc ArrayBlockingQueue thay thế. Kích thước của đầu tiên có thể được tùy chọn giới hạn, trong khi thứ hai là luôn luôn bị chặn.

+0

Cảm ơn câu trả lời của bạn, Tuy nhiên tôi đã sử dụng ConcurrentLinkedQueue vì nó đồng thời, Bạn có đề xuất các lớp không đồng bộ sẽ yêu cầu tôi thêm đồng bộ hóa khi truy cập các biến này không? – Youval

+1

@Youval, tất cả các triển khai 'BlockingQueue' đều an toàn theo luồng, như được khai báo trong [tài liệu API] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html). –

+0

Tuy nhiên việc chặn một chuỗi có thể ảnh hưởng đến hiệu suất ứng dụng tổng thể trong các ứng dụng đồng thời cao. Vì vậy, có khuyết điểm và thuận. –

0

Tôi hơi trễ một chút, nhưng bạn luôn có thể thiết lập giới hạn trên và khi vượt quá, phương pháp của bạn sẽ tiêu thụ một mã thông báo để nhường chỗ cho thẻ tiếp theo.

Các vấn đề liên quan