2010-04-23 32 views

Trả lời

45

Có. Từ the docs:..

"BlockingQueue triển khai là thread-safe Tất cả các phương pháp xếp hàng đạt được tác động của chúng nguyên tử sử dụng khóa nội bộ hoặc các hình thức kiểm soát đồng thời Tuy nhiên, phần lớn Bộ sưu tập các hoạt động addAll, containsAll, retainAll và removeAll không nhất thiết phải được thực hiện một cách nguyên tắc trừ khi được chỉ định khác trong khi triển khai.chỉ thêm một số thành phần trong c. "

+0

không phải là nó thực sự. Không, không phải nếu bạn chỉ sử dụng thêm và mất, nhưng nếu bạn sẽ sử dụng một hoạt động số lượng lớn, bạn sẽ phải đồng bộ hóa nó thay vì chỉ đơn giản là "Có"? Hoặc tôi đọc doc sai? – cproinger

+0

@cproinger, không, bạn không bao giờ phải đồng bộ hóa nó, miễn là bạn sẵn sàng đối phó với 'addAll' ném một ngoại lệ sau khi thêm một tập con của các mục (hoặc tương tự). Nó phụ thuộc vào cách bạn xác định thread-safe. Bạn nói đúng rằng các phương thức hàng loạt không có đảm bảo nguyên tử. –

+0

Có phải 'remove' cũng là chủ đề an toàn không? – q126y

8

Vâng, BlockingQueue phương pháp add()take() được an toàn nhưng với một sự khác biệt chủ đề.

add()take() phương pháp sử dụng 2 đối tượng ReentrantLock khác nhau.

add() phương pháp sử dụng

private final ReentrantLock putLock = new ReentrantLock(); 

take() phương pháp sử dụng

private final ReentrantLock takeLock = new ReentrantLock(); 

Do đó, truy cập đồng thời để add() phương pháp được đồng bộ. Tương tự, truy cập đồng thời vào phương thức take()synchronized.

Nhưng, truy cập đồng thời để add()take() phương pháp không phải là synchronized kể từ khi họ đang sử dụng 2 đối tượng khóa khác nhau (ngoại trừ trong điều kiện cạnh của hàng đợi đầy đủ/trống).

+3

Câu trả lời này đưa ra một quan sát hợp lệ, nhưng nhớ rằng những người triển khai LinkedBlockingQueue đã nhận thức được vấn đề này và giải quyết nó. Chi tiết tại đây: http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 –

+0

Có, tôi đồng ý. LInkedBlockingQueue cung cấp đồng thời betters hơn ArrayBlockingQueue và duy trì an toàn luồng chỉ bằng cách đồng bộ hóa điều kiện cạnh. Chèn và xóa các phương thức đã được đồng bộ hóa thông minh cho các trường hợp cạnh chỉ –

+0

Câu trả lời này không chính xác. 'add' và' take' là chuỗi an toàn và có thể được sử dụng đồng thời mà không cần đồng bộ hóa thêm. – ens

0

Đơn giản chỉ cần có, chủ đề chắc chắn của nó an toàn nếu không nó sẽ không đủ điều kiện làm ứng cử viên để lưu trữ phần tử cho ThreadPoolExecutor.

Chỉ cần thêm và truy xuất phần tử mà không phải lo lắng về đồng thời cho BlockingQueue.

Các vấn đề liên quan