Tôi có vấn đề cổ điển về sự kiện đẩy luồng tới hàng đợi đến của chuỗi thứ hai. Chỉ có thời gian này, tôi rất quan tâm đến hiệu suất. Những gì tôi muốn đạt được là:Hàng đợi đồng thời và chặn trong Java
- Tôi muốn truy cập đồng thời vào hàng đợi, nhà sản xuất đẩy, người nhận bật lên.
- Khi hàng đợi trống, tôi muốn người tiêu dùng chặn hàng đợi, đợi nhà sản xuất.
Ý tưởng đầu tiên của tôi là sử dụng LinkedBlockingQueue
, nhưng tôi sớm nhận ra rằng nó không đồng thời và hiệu suất bị ảnh hưởng. Mặt khác, bây giờ tôi sử dụng một số ConcurrentLinkedQueue
, nhưng tôi vẫn phải trả chi phí wait()
/notify()
trên mỗi ấn phẩm. Vì người tiêu dùng, khi tìm hàng trống, không chặn, tôi phải đồng bộ hóa và wait()
trên khóa. Mặt khác, nhà sản xuất phải lấy khóa đó và notify()
sau mỗi lần xuất bản. Kết quả tổng thể là tôi đang trả chi phí sycnhronized (lock) {lock.notify()}
trong mọi ấn bản duy nhất, ngay cả khi không cần thiết.
Điều tôi đoán là cần thiết ở đây, là hàng đợi vừa chặn vừa đồng thời. Tôi hình dung hoạt động của push()
hoạt động như trong ConcurrentLinkedQueue
, với thêm notify()
đối tượng khi phần tử được đẩy là phần tử đầu tiên trong danh sách. Một kiểm tra như vậy tôi coi là đã tồn tại trong ConcurrentLinkedQueue
, vì việc đẩy yêu cầu kết nối với phần tử tiếp theo. Do đó, điều này sẽ nhanh hơn nhiều so với đồng bộ hóa mọi lúc trên khóa ngoài.
Có điều gì đó như thế này có sẵn/hợp lý không?
Tại sao bạn nghĩ rằng java.util.concurrent.LinkedBlockingQueue không đồng thời? Tôi nghĩ rằng nó là hoàn toàn đồng thời, nhìn thấy javadoc của nó và mã nguồn. Nhưng không có ý tưởng về hiệu suất. – Rorick
Xem thêm http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one – Vadzim