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?

  1. Beklemeye başladığında kilidi serbest bırakıyor mu? (Örneğin notFull.await())?
  2. farklı parçacığı aynı kilidi kazanmak ve diğer konuları awaking, bunun signal() bir koşul kadar taşıyabilir miyim?
  3. 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.

cevap

2
  1. Evet, bu bir koşul için beklediği anda, kilidi serbest bırakır. await/signal/signalAll aslında wait/notify/notifyAll
  2. yok ReentrantLock böylece tek bir iplik kilidi edinebilirler özel bir kilit olduğu gibi aynı davranışı vardır.
  3. # 1'e bakın. Bir iş parçacığı çağrı signal veya signalAll, sırasıyla bir iş parçacığı serbest bırakır veya tüm ipler iplik veya bu konu tekrar kilidi elde etmek için uygun olacağını tekabül Condition böyle için bekleyen zaman. Ancak şimdilik kilit, signal veya signalAll veya signalAll olarak adlandırılan iş parçacığına ait olup, lock.unlock numaralı telefonu arayarak kilidi açıkça serbest bırakır. Ardından/serbest bırakıldı olan iplik (ler), yine kilidi elde etmek koşulu ile (yine Bunda count == items.length veya count == 0 demek bu kez durumunu kontrol etmek mümkün olacak kilidi kazanabilmesinden iplik denemek mümkün olacak örnek), eğer tamamsa, aksi takdirde await olacaktır ve başka bir iş parçacığı için kullanılabilir hale getirmek için kilidi serbest bırakacaktır.