4
, aşağıdaki örnekte verilmiştir:java.util.concurrent.locks.Condition nasıl çalışır? <code>java.util.concurrent.locks.Condition</code> arayüzü hakkında Java 8 belgelerine Okuma
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();
}
}
}
Yani benim ana soru şu: bir koşul nasıl çalışır?
- Beklemeye başladığında kilidi serbest bırakıyor mu? (Örneğin
notFull.await()
)? - farklı parçacığı aynı kilidi kazanmak ve diğer konuları awaking, bunun
signal()
bir koşul kadar taşıyabilir miyim? - Bu örnek bir kilitlenme ile sonuçlanacağını sanıyordum çünkü bir iş parçacığı arabelleği boş boşta beklemiyorsa ve kilidi henüz açmadıysa, başka bir iş parçacığı kilidi nasıl alabilir, arabelleği boşaltır,
signal()
koşul artık karşılandı ve kilitleme arabelleğin tam olmamasını bekleyen iş parçacığı tarafından serbest bırakılmadıysa kilidini bırakın?
Bu başlayanlar sorulardır. Lütfen bana yardım edin.
Teşekkür ederiz.