Câu hỏi này xứng đáng có một câu trả lời tốt hơn.
Java's ConcurrentLinkedQueue
dựa trên thuật toán nổi tiếng của Maged M. Michael và Michael L. Scott cho các hàng đợi không khóa không khóa .
"Không chặn" như một thuật ngữ ở đây cho một tài nguyên cạnh tranh (hàng đợi của chúng tôi) có nghĩa là bất kể trình lập lịch của nền tảng làm gì, như làm gián đoạn một chuỗi hoặc nếu chuỗi được đề cập đơn giản là quá chậm, các chuỗi khác sẽ tranh giành cùng một tài nguyên vẫn sẽ có thể tiến triển. Ví dụ: nếu liên quan đến một khóa, chuỗi đang giữ khóa có thể bị gián đoạn và tất cả các chuỗi đang chờ khóa đó sẽ bị chặn. Khóa nội tại ( synchronized
từ khóa) trong Java cũng có thể đi kèm với một hình phạt nghiêm trọng cho hiệu suất - như khi khóa thiên vịcó liên quan và bạn có tranh chấp hoặc sau khi máy ảo quyết định "thổi phồng" khóa sau thời gian gia hạn quay vòng và chặn các chủ đề cạnh tranh ... đó là lý do tại sao trong nhiều bối cảnh (tình huống tranh chấp thấp / trung bình), thực hiện so sánh-và -sets trên tham chiếu nguyên tử có thể hiệu quả hơn nhiều và đây chính xác là điều mà nhiều cấu trúc dữ liệu không chặn đang làm.
Java ConcurrentLinkedQueue
không chỉ không bị chặn, mà còn có đặc tính tuyệt vời mà nhà sản xuất không cạnh tranh với người tiêu dùng. Trong kịch bản một nhà sản xuất / một người tiêu dùng duy nhất (SPSC), điều này thực sự có nghĩa là sẽ không có gì phải bàn cãi. Trong một kịch bản nhiều nhà sản xuất / một người tiêu dùng, người tiêu dùng sẽ không cạnh tranh với các nhà sản xuất. Hàng đợi này không có sự tranh chấp khi nhiều nhà sản xuất cố gắng offer()
, nhưng đó là đồng thời theo định nghĩa. Về cơ bản, đó là một mục đích chung và hàng đợi không chặn hiệu quả.
Đối với nó không phải là một BlockingQueue
, tốt, chặn một luồng để chờ trên hàng đợi là một cách khủng khiếp khủng khiếp để thiết kế các hệ thống đồng thời. Đừng. Nếu bạn không thể tìm ra cách sử dụng một ConcurrentLinkedQueue
kịch bản dành cho người tiêu dùng / nhà sản xuất, thì chỉ cần chuyển sang các nội dung trừu tượng cấp cao hơn, như một khuôn khổ tác nhân tốt.