2014-09-12 15 views
6

'u uygulamak için bir QueudSynchronizer kullanmanın avantajı nedir? CountLatch, bir iş parçacığının (veya birçok iş parçacığının), bir CountLatch nesnesinde await() numaralı çağrıyı arayarak engelleyebileceği bir iş parçacığı denetim mekanizmasıdır; bu, countDown() yönteminin bazı numaralar çağrıldığında serbest bırakılır. zamanlarınCountLatch

private volatile int count; // initialised in constructor 

public synchronized void countDown() { 
    count--; 
    if(count <= 0) { 
     notifyAll(); 
    } 
} 

public synchronized void await() throws InterruptedException { 
    while(count > 0) { 
     wait(); 
    } 
} 

Ancak, Java 5 kendi uygulamasını sağlar: Ben wait() ve notify() ile iplik kontrol kavramına aşina olduğumdan

, böyle CountLatch ait (bana) bir bariz uygulama vardır AbstractQueuedSynchronizer'dan genişletilmiş bir iç sınıf kullanan java.util.concurrent.CountLatch.

  • countDown() aramalar sync.releaseShared(1)
  • await() aramalar

bu daha karmaşık yaklaşımın avantajı nedir sync.acquireSharedInterruptibly(1):

private static final class Sync extends AbstractQueuedSynchronizer { 
    Sync(int count) { 
     setState(count); 
    } 

    int getCount() { 
     return getState(); 
    } 

    protected int tryAcquireShared(int acquires) { 
     return (getState() == 0) ? 1 : -1; 
    } 

    protected boolean tryReleaseShared(int releases) { 
     // Decrement count; signal when transition to zero 
     for (;;) { 
      int c = getState(); 
      if (c == 0) 
       return false; 
      int nextc = c-1; 
      if (compareAndSetState(c, nextc)) 
       return nextc == 0; 
      } 
     } 
    } 

Java 5 CountLatch bu Sync nesne etrafında bir sarıcı esasen nedir?

cevap

5

Önerilen yaklaşımınız ile JDK arasındaki temel fark, AbstractQueuedSynchronizer kilitliyken kilitleri kullanıyor olmanız ve orta düzeyde çekişme altında daha iyi performans sunan Compare-And-Swap'ı dahili olarak kullanmanızdır.