2013-04-13 19 views
9

Trong khi đọc mã nguồn của ArrayBlockingQueue, tôi tìm thấy một bình luận giải thích rằng nó sử dụng "thuật toán hai điều kiện cổ điển được tìm thấy trong bất kỳ cuốn sách giáo khoa":tại sao Concurrency kiểm soát sử dụng cổ điển thuật toán hai điều kiện

/* 
* Concurrency control uses the classic two-condition algorithm 
* found in any textbook. 
*/ 

/** Main lock guarding all access */ 
private final ReentrantLock lock; 
/** Condition for waiting takes */ 
private final Condition notEmpty; 
/** Condition for waiting puts */ 
private final Condition notFull; 

Tại sao nó sử dụng thuật toán hai điều kiện (notEmpty, notFull) cổ điển?

+10

Nó cho phép chỉ đánh thức đề quan tâm bất cứ điều gì vừa xảy ra. Ví dụ, một thread cố gắng 'take' từ một hàng đợi rỗng, chỉ quan tâm đến hàng đợi không rỗng (có cái gì đó cần lấy), nhưng không quan tâm đến hàng đợi không đầy. – assylias

+0

Đây là một câu trả lời * đẹp * :) –

+0

Câu hỏi của bạn cho thấy rằng bạn không đồng ý hoặc không hiểu quyết định của tác giả. Bạn có biết cách tiếp cận nào khác để thay thế? – seh

Trả lời

1

Bạn đã có một nhận xét hay. Chỉ như một bổ sung.

ArrayBlockingQueueState-Dependent. Điều này có nghĩa rằng lớp này có các hoạt động mà chỉ có thể được thực hiện với một số điều kiện tiên quyết.

Chủ đề của người viết sẽ chỉ chờ nếu điều kiện tiên quyết (notFull) là sai.

// Nếu hàng đợi đầy thì nhà văn cần đợi.
// Phát hành nguyên bản khóa và chờ tín hiệu (notFull.signal() do người đọc bắn).
trong khi (count == items.length)
notFull.await();

Đối với người đọc, khái niệm giống hệt nhau, nhưng sử dụng điều kiện notEmpty.

// Nếu hàng đợi trống thì người đọc cần đợi.
// Phát hành nguyên bản khóa và chờ tín hiệu (notEmpty.signal() được kích hoạt bởi một người ghi).
trong khi (count == 0)
notEmpty.await();

Khi một thread tỉnh dậy thì bạn cần 2 điều chính:
1 - Lấy khóa
2 - Re-Kiểm tra các điều kiện

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