Các mã sau đây được lấy từ JavaDoc of Condition
:chờ vào một điều kiện trong một reentrant khóa
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
Imagine 2 chủ đề, Consumer và Nhà sản xuất, một sử dụng take
, một put
trên một trường hợp duy nhất của BoundedBuffer
.
Hãy nói rằng Consumer đi đầu tiên, chạy take()
trong đó ông khóa lock
và bây giờ vòng trên notEmpty.await();
.
Làm thế nào có thể bây giờ Nhà sản xuất có thể nhận được vào put()
phương pháp qua khóa lock
, mà đã được tổ chức bởi các Consumer?
Tôi thiếu gì ở đây? Là lock
"tạm thời được phát hành" trong khi luồng đang chờ một trong các điều kiện của nó? Và chính xác reentrancy của khóa có nghĩa là gì?
tôi là khoảng hai hỏi chính xác cùng một câu hỏi với chính xác cùng một ví dụ về JavaDoc :) Lưu tôi khỏi mất thời gian. – Bren