2013-08-27 27 views
5

Tôi có tình huống có nhiều chủ đề sẽ bỏ phiếu một đơn BlockingQueue bằng cách gọi take(). Những gì tôi muốn biết là:BlockingQueues và thứ tự truy cập chuỗi

Nếu có nhiều chuỗi đang đợi hàng đợi nhận mục, họ sẽ được ưu tiên cho việc đưa các mục ra khỏi hàng đợi theo thứ tự mà họ thực hiện cuộc gọi của họ để thực hiện() hoặc thứ tự mà trong đó các chủ đề đưa mọi thứ ra khỏi hàng đợi là tùy ý?

Cảm ơn!

Lưu ý: Tôi đã viết các triển khai của riêng mình cho loại điều này trong quá khứ, nhưng tôi tự hỏi liệu việc triển khai BlockingQueue trong Java có làm điều này cho tôi hay không.

+1

Nói chung, mọi ứng dụng đa luồng sẽ không đưa ra bất kỳ giả định nào về thứ tự thực thi chuỗi. Có nhiều cách để thực thi nó, nhưng ý tưởng đằng sau các ứng dụng MT là nó không nên được thực hiện. – Dariusz

+1

Câu hỏi thú vị, tôi đã viết và chạy một chương trình - không có lệnh cố định nào. – Tala

+1

[Câu hỏi liên quan] (http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one) cũng thảo luận về sự công bằng. –

Trả lời

4

Điều đó tùy thuộc vào việc triển khai.

Nếu bạn sử dụng một LinkedBlockingQueue, các take() phương pháp kiểm tra với một ReentrantLock

public E take() throws InterruptedException { 
    E x; 
    int c = -1; 
    final AtomicInteger count = this.count; 
    final ReentrantLock takeLock = this.takeLock; 
    takeLock.lockInterruptibly(); 
    ... 
} 

// declared as 
private final ReentrantLock takeLock = new ReentrantLock(); // no fairness argument, defaults to false 

Các javadoc nói

Các constructor cho lớp này chấp nhận một tham số công bằng tùy chọn. Khi đặt đúng, dưới ganh đua, các khóa sẽ ưu tiên cấp quyền truy cập vào chuỗi chờ đợi lâu nhất. Nếu không, khóa này không đảm bảo bất kỳ thứ tự truy cập cụ thể. Các chương trình sử dụng khóa công bằng được truy cập bởi nhiều chủ đề có thể hiển thị thông lượng tổng thể thấp hơn (tức là chậm hơn; thường là chậm hơn nhiều) so với sử dụng cài đặt mặc định, nhưng có ít hơn phương sai để lấy khóa và đảm bảo thiếu đói. Tuy nhiên, xin lưu ý rằng sự công bằng của ổ khóa không đảm bảo tính công bằng của việc lập lịch trình chuỗi . Do đó, một trong nhiều chủ đề sử dụng khóa công bằng có thể lấy nó nhiều lần liên tiếp trong khi các chủ đề đang hoạt động khác là không tiến triển và hiện không giữ khóa. Cũng lưu ý rằng phương pháp tryLock không phương pháp không tôn trọng cài đặt công bằng. Nó sẽ thành công nếu khóa khả dụng ngay cả khi các chủ đề khác đang chờ.

2

Trong nhiều trường hợp, javadocs đề cập đến nếu lớp là "công bằng", tức là chặn được phân phối để tất cả các chuỗi có cùng cơ hội. Điều này không cần thiết có nghĩa là giống như "được trong cùng một thứ tự" tuy nhiên. Kiểm tra javadocs để thực hiện hàng đợi cụ thể của bạn để xem liệu nó có thông tin về sự công bằng và/hoặc trật tự.

Ít nhất ArrayBlockingQueue thông báo của công bằng như sau:

Lớp này hỗ trợ một chính sách công bằng tùy chọn cho đặt hàng chờ đợi nhà sản xuất và người tiêu dùng đề. Theo mặc định, yêu cầu này không được bảo đảm là . Tuy nhiên, một hàng đợi được xây dựng với độ công bằng được đặt thành đúng cấp quyền truy cập chủ đề theo thứ tự FIFO. Sự công bằng thường làm giảm thông lượng nhưng giảm sự biến đổi và tránh nạn đói.

1

Nó phụ thuộc vào việc triển khai, cho dù một lớp học có hỗ trợ chính sách công bằng tùy chọn cho việc đặt hàng nhà sản xuất đang chờ và chủ đề người tiêu dùng hay không. Ví dụ.ArrayBlockingQueue có thể công bằng vì nó có hàm tạo ArrayBlockingQueue (int capacity, boolean fair), nhưng LinkedBlockingQueue cant.

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