2016-05-01 4 views
-2

utils.concurrentにこのような複雑なソースコードがある理由を知りたい。 これは私がCountDownLatchのために出したコードですが、テストしたところ、ソースコードで何か似たものが見つかると思っていましたが、それはスーパーコンプレックスです。なぜCountDownLatchソースが複雑なのですか?

私の実装に間違いはありますか?

public class CountDown { 

    private int count; 
    private Object lock; 

    public CountDown(int count) 
    { 
     lock = new Object(); 
     this.count = count; 
    } 
    //Just waits until it is notified by CountDown. Keeps waiting if not 0. 
    public void await() throws InterruptedException 
    { 
     synchronized (lock) { 
      while(count != 0) 
      { 
       lock.wait(); 
      } 
     } 
    } 
    //Decreases the count and notifies for await's lock. 
    public void countDown() 
    { 
     synchronized (lock) { 
      this.count--; 
      lock.notify();   
     } 
    } 
} 

そしてここで、ソースコードがあります:Source Code CountDownLatch

+0

あなたの実装には、多くの機能がありません。欠落している機能をすべて追加すると、実装はほとんど同じに見えます。 –

+0

などの機能?非常に複雑なメソッドがあります。たとえば、プライベートクラスSync内のループはどうですか? –

+0

ああ、うわー...もし誰かがdownvoteに行くなら、少なくとも私に教えてください。 –

答えて

1

たCountDownLatchは、AbstractQueuedSynchronizerの単なるラッパーのようです。私はDougがそれに気づき、そのアプローチに進むことに決めたと思う。それがさらにその現在のデザインにつながる。

CountDownLatchでプライベートSynchクラスを介して見る重要な機能の1つは、割り込みフラグのチェックがあることです。これは、数十億回使用される共通のライブラリコードでは非常に重要です。つまり、Interruptフラグが以前のどこかに設定されていれば、CountDownLatchはそれを尊重して待ち状態には入りません。これにより、アプリケーションが終了し、すべてのスレッドが中断されたときにスレッドがハングしないようにすることができます。私はアプリケーションをシャットダウンするときに、この問題を多く見て、-9シグナルでPIDを強制終了させます。通常の原因は、割り込みを適切に処理したり、それをチェックしたりしない悪いマルチスレッドコードです。

+0

ありがとう、私はその可能性を考えなかった。 –