new SynchronousQueue()
new LinkedBlockingQueue(1)
Sự khác biệt là gì? Khi nào tôi nên sử dụng SynchronousQueue
chống lại LinkedBlockingQueue
với dung lượng 1?Khi nào tôi nên sử dụng SynchronousQueue
new SynchronousQueue()
new LinkedBlockingQueue(1)
Sự khác biệt là gì? Khi nào tôi nên sử dụng SynchronousQueue
chống lại LinkedBlockingQueue
với dung lượng 1?Khi nào tôi nên sử dụng SynchronousQueue
SynchronousQueue có nhiều tính năng hơn, trong khi LinkedBlockingQueue chỉ cho phép một phần tử duy nhất. Sự khác biệt là cuộc gọi put() đến một SynchronousQueue sẽ không trả về cho đến khi có một cuộc gọi take() tương ứng, nhưng với một LinkedBlockingQueue của kích thước 1, lệnh put() (đến một hàng đợi trống) sẽ trở lại ngay lập tức.
Tôi không thể nói rằng tôi đã từng sử dụng trực tiếp SynchronousQueue, nhưng đó là BlockingQueue mặc định được sử dụng cho các phương thức Executors.newCachedThreadPool()
. Về cơ bản, việc triển khai BlockingQueue là khi bạn không thực sự muốn một hàng đợi (bạn không muốn duy trì bất kỳ dữ liệu đang chờ xử lý nào).
Theo như tôi hiểu mã ở trên, thực hiện tương tự.
Không, mã không giống nhau chút nào.
Đồng bộ hóa.Q. yêu cầu phải có người phục vụ để cung cấp thành công. LBQ sẽ giữ cho sản phẩm và đề nghị sẽ kết thúc ngay lập tức ngay cả khi không có người phục vụ.
SyncQ rất hữu ích cho việc giao nhiệm vụ. Hãy tưởng tượng bạn có một danh sách w/chờ nhiệm vụ và 3 chủ đề có sẵn chờ đợi trên hàng đợi, hãy thử offer()
với 1/4 của danh sách nếu không được chấp nhận các chủ đề có thể chạy các nhiệm vụ của riêng mình. [1/4 cuối cùng nên được xử lý bởi các chủ đề hiện tại, nếu bạn tự hỏi tại sao 1/4 và không 1/3]
Hãy cố gắng giao nhiệm vụ cho một công nhân, nếu không có sẵn, bạn có một tùy chọn để thực hiện nhiệm vụ của riêng bạn (hoặc ném một ngoại lệ). Trái với w/LBQ, để lại nhiệm vụ trong hàng đợi không đảm bảo thực hiện.
Lưu ý: trường hợp w/người tiêu dùng và nhà xuất bản là như nhau, tức là nhà xuất bản có thể chặn và chờ người tiêu dùng nhưng sau khi trả về offer
hoặc poll
, đảm bảo nhiệm vụ/phần tử được xử lý.
Một lý do để sử dụng SynchronousQueue là cải thiện hiệu suất ứng dụng. Nếu bạn phải có một tay giữa các chủ đề, bạn sẽ cần một số đối tượng đồng bộ hóa. Nếu bạn có thể đáp ứng các điều kiện cần thiết để sử dụng, SynchronousQueue là đối tượng đồng bộ hóa nhanh nhất mà tôi đã tìm thấy. Những người khác đồng ý. Xem: Implementation of BlockingQueue: What are the differences between SynchronousQueue and LinkedBlockingQueue
SynchronousQueue làm việc trong một thời trang tương tự với sự khác biệt sau đây chính: 1) Kích thước của SynchronousQueue là 0 2) put() phương pháp sẽ chỉ chèn một phần tử nếu mất() phương pháp sẽ có thể lấy đó phần tử từ hàng đợi tại cùng một thời điểm tức là một phần tử không thể được chèn vào nếu người tiêu dùng gọi() sẽ mất một chút thời gian để tiêu thụ nó.
Đồng bộQueue - Chỉ chèn khi ai đó sẽ nhận được nó tại thời điểm đó.
Ok, do đó, ý tưởng chính là, nó chặn đọc chuỗi cho đến khi kết quả đã sẵn sàng và chặn viết chuỗi cho đến khi đọc chuỗi đã sẵn sàng để đọc. Bạn có thể vui lòng cung cấp ví dụ thực tế khi nó có thể hữu ích – Anton
@Umar Khi một số luồng tạo đối tượng cho hàng đợi nhanh hơn người tiêu dùng có thể tiêu thụ và xử lý chúng - một hàng đợi có thể tăng kích thước. SynchronousQueue giúp kiểm soát giao tiếp mà không cần bất kỳ mã cụ thể nào trong nhà sản xuất.Trong cuộc sống thực, nó tương tự như một cuộc họp mà một người trả lời các câu hỏi mà người khác hỏi. Xem xét SynchronousQueue như một loại thư ký. – andrey
Tôi sử dụng SyncQ khá một chút, đó là một thiết bị cầm tay trừu tượng và tương đối tốt. (nó có phân bổ khi chờ) – bestsss