El código siguiente se toma de la JavaDoc of Condition
:espera en una condición en un reentrante bloquear
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();
}
}
}
Imagínese 2 hilos, Consumer y Productor, uno usando take
, uno put
en una sola instancia de BoundedBuffer
.
Digamos Consumidor va primero, corre take()
en la que bloquea la lock
y ahora bucles en notEmpty.await();
.
¿Cómo puede ahora Productor posiblemente entrar en el método put()
pasado el bloqueo de la lock
, que ya está en manos de la Consumidor?
¿Qué me falta aquí? ¿Está el lock
"liberado temporalmente" mientras el hilo está esperando en una de sus condiciones? ¿Y qué significa la reentrada de la cerradura, exactamente?
estaba a punto de dos preguntan exactamente la misma pregunta con exactamente el mismo ejemplo en JavaDoc :) Me salvó de perder tiempo. – Bren