JAva並発注のCondition


1.概括
  • Conditionはjava条件キューの実装であり、これは、複数のスレッド間で異なるConditionを確立できることを意味する.
  • は、マルチスレッド間で通信を調整するツールクラスとして、各条件Contitionオブジェクトの内部に独自の待機キューが維持され、あるスレッドまたはあるスレッドが一緒にある条件(条件が(signalまたはsignalAllメソッドが呼び出される)を備えている場合にのみ、これらの待機スレッドが起動され、ロックが再争奪される.

  • 2.例
  • 以下は『同時プログラミング実戦』からの例であり、第1セグメントコードは元のsynchronized+notify+条件述語で実現された条件キューであり、第2セグメントコードはjavaを使用して発注されたCondition+Lockである.
  • //synchronized+notify       
    public class BoundedBuffer extends BaseBoundedBuffer<V>{
        //    :not-full(      !isFull()  )
        //    :not-empty(      !isEmpty()  )
    
        public BoundedBuffer(int size){super(size)};
    
        //  ,  not-full
        public synchronized void put(V v) throws InterruptedException{
             while(isFull()){
                 wait(); //     ,    
             }
             doPut(v); //      
             notifyAll();//        
        }
    
        //  ,  not-empty
        public synchronized V take(V v) throws InterruptedException{
             while(isEmpty()){
                 wait(); //     ,    
             }
             V v = doTake(); //      
             notifyAll();//        
             return v;
        }
    }
    //  java    Condition + Lock
    public class BoundedBuffer  extends BaseBoundedBuffer{
       final Lock lock = new ReentrantLock();//   
       final Condition notFull  = lock.newCondition();//      
       final Condition notEmpty = lock.newCondition();//      
    
       public void put(V v) throws InterruptedException {
         lock.lock();
         try {
           while (isFull())//       
             notFull.await();//     
           doPut(v); //      
           notEmpty.signal();//     
         } finally {
           lock.unlock();
         }
       }
    
       public V take() throws InterruptedException {
         lock.lock();
         try {
           while (count == 0)//      
             notEmpty.await();//     
           V v = doTake();
           notFull.signal();//     
           return v;
         } finally {
           lock.unlock();
         }
       } 
     }
    
  • 両端コードを比較すると、それらが実現する機能は実際には同じであり、第2セグメントコード構造はより明確である.

  • 3.まとめ
  • Conditionは、Objectモニタメソッド(wait、notify、notifyAll)を条件によって異なるオブジェクトに分解し、これらのオブジェクトを任意のロックと組み合わせて使用することで、各オブジェクトに複数の待機setを提供する(wait-set).ここで、Lockはsynchronizedメソッドと文の代わりに、ConditionはObjectモニタメソッドの代わりに使用されます.ConditionはsynchronizedとLockに比べて非常に柔軟で、いくつかのシーンの効率が高く、多条件の議論に適しています.