Tôi có một ứng dụng viết nhiều luồng và đọc một ConcurrentLinkedQueue, được sử dụng khái niệm để quay lại các mục trong một danh sách/bảng. Ban đầu tôi sử dụng ConcurrentHashMap để làm việc này. Yêu cầu mới yêu cầu theo dõi các mục nhập đã đến, vì vậy chúng có thể được xóa theo thứ tự cũ nhất, tùy thuộc vào một số điều kiện. ConcurrentLinkedQueue dường như là một lựa chọn tốt và chức năng hoạt động tốt.
Số lượng mục nhập có thể định cấu hình được giữ trong bộ nhớ và khi mục nhập mới được cung cấp khi đạt đến giới hạn, hàng đợi được tìm kiếm theo thứ tự cũ nhất cho thứ tự có thể bị xóa. Một số mục không được hệ thống loại bỏ và chờ tương tác của khách hàng.
Điều gì dường như đang xảy ra là tôi có mục nhập ở phía trước hàng đợi đã xảy ra, nói 100 nghìn mục trước đây. Hàng đợi dường như có số lượng mục được định cấu hình hạn chế (size() == 100), nhưng khi lược tả, tôi thấy rằng có ~ 100K đối tượng ConcurrentLinkedQueue $ Node trong bộ nhớ. Điều này dường như được thiết kế, chỉ cần liếc nhìn nguồn cho ConcurrentLinkedQueue, một loại bỏ chỉ đơn thuần loại bỏ tham chiếu đến đối tượng đang được lưu trữ nhưng để lại danh sách liên kết tại chỗ để lặp lại.
Cuối cùng câu hỏi của tôi: Có cách nào tốt hơn "lười biếng" để xử lý một bộ sưu tập bản chất này không? Tôi thích tốc độ của ConcurrentLinkedQueue, tôi không thể đủ khả năng rò rỉ vô biên mà dường như có thể xảy ra trong trường hợp này. Nếu không, có vẻ như tôi sẽ phải tạo một cấu trúc thứ hai để theo dõi thứ tự và có thể có cùng một vấn đề, cộng với một mối quan tâm đồng bộ hóa.
Nếu bạn không thể tìm thấy câu trả lời ở đây, hãy truy cập http://altair.cs.oswego.edu/mai lman/listinfo/concurrency-interest và đăng câu hỏi của bạn ở đó. Có lẽ tác giả của ConcurrentLinkedQueue sẽ cung cấp cho bạn một câu trả lời quyết định. –