Khi làm việc với ConcurrentLinkedQueue, làm thế nào tôi có thể giới hạn kích thước của Hàng đợi. Có thể là nó sẽ thông qua ngoại lệ outofmemory?Ngăn ngừa ConcurrentLinkedQueue <T> từ outofmemory Ngoại lệ
6
A
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
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ả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
@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). –
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. –