5

Tôi đã đọc các blog, nhưng tôi không chắc chắn liệu kết luận của ông là chính xác:Sự khác nhau giữa LinkedBlockingQueue và ConcurrentLinkedQueue là gì?

http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp

Ông nói: Như bạn có thể nhìn thấy từ việc thực hiện cung cấp kết quả LinkedBlockingQueue đạt được kết hợp tốt nhất (thêm và loại bỏ các yếu tố) kết quả hiệu suất và phải là ứng cử viên số một của bạn để thực hiện các chương trình dành cho người tiêu dùng sản xuất - người tiêu dùng.

Tôi tự hỏi rằng, không làm điều đó nhanh hơn nếu tôi không sử dụng khóa trong mã của mình?

Vậy tại sao LinkedBlockingQueue nhanh hơn hàng đợi không khóa (ConcurrentLinkedQueue)?

Cảm ơn!

+3

Quên blog ngẫu nhiên: có bạn coi đọc * Javadoc * DID không phải là những từ 'bị chặn', 'không bị chặn' và 'chặn' truyền đạt bất cứ điều gì cả? – EJP

+0

Liên quan: http://stackoverflow.com/q/1426754/931379 – Pursuit

Trả lời

4

ConcurrentLinkedQueue không phải là chặn hàng đợi. Nó không thực hiện giao diện BlockingQueue, và do đó không cung cấp các phương thức chặn put() và take(). Những phương pháp này là cần thiết cho một nhà sản xuất/người tiêu dùng thiết lập, bởi vì bạn cần phải sắp xếp cho người tiêu dùng để chặn trong khi không có gì để tiêu thụ, và cho nhà sản xuất để chặn khi người tiêu dùng không tiêu thụ đủ nhanh.

-1

LinkedBlockingQueue là Deque và ConcurrentBlockingQueue thì không. Kiểm tra Javadoc để biết thêm chi tiết

+1

[LinkedBlockingDeque] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingDeque.html) và [LinkedBlockingQueue] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html) là hai lớp khác nhau. –

+0

Tôi không nghĩ rằng LInkedBlockingQueue là một deque, và tôi không nghĩ ConcurrentBlockingQueue là một lớp trong thời gian chạy Java. –

1

Điểm chuẩn này là lạ: sử dụng hàng đợi đồng thời làm hàng đợi chặn không có ý nghĩa hoặc tôi thiếu thứ gì đó. Mã này sẽ không lưu các hành tinh Tôi đoán:

while(result == null) 
    result = concurrentLinkedQueue.poll(); 

và tất nhiên là kém hiệu quả hơn:

linkedBlockingQueue.take(); 
Các vấn đề liên quan