0

実際のJava並行性からのこのコードスニペット、私は本当に理解していません。

@ThreadSafe
public class BoundedBuffer<V> extends BaseBoundedBuffer<V> {
    // CONDITION PREDICATE: not-full (!isFull())
    // CONDITION PREDICATE: not-empty (!isEmpty())

    public BoundedBuffer(int size) { super(size); }

    // BLOCKS-UNTIL: not-full
    public  synchronized  void put(V v) throws InterruptedException {
        while (isFull())
            wait();
        doPut(v);
        notifyAll();
    }

    // BLOCKS-UNTIL: not-empty
    public  dsynchronize  V take() throws InterruptedException {
        while (isEmpty())
            wait();
        V v = doTake();
        notifyAll();
        return v;
    }
}

putメソッドとtakeメソッドは同期されています。あるスレッドがputメソッドで待機している場合、誰もtakeまたはputメソッドに入ることができないため、ほとんどの場合、スレッドが待機を開始すると、それは永遠に待機します。

私は何かを理解していませんか?

4

1 に答える 1

4

それはそうですsynchronizedが、wait()メソッドは待機するとロックを解放しました-それがどのように機能するかです。その後、スレッドは通知されるまでブロックします。通知されると、ロックを再取得して続行します。Object.wait()javadocsを引用するには:

別のスレッドがこのオブジェクトのjava.lang.Object.notify()メソッドまたはjava.lang.Object.notifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。つまり、このメソッドは、単にwait(0)の呼び出しを実行する場合とまったく同じように動作します。

現在のスレッドは、このオブジェクトのモニターを所有している必要があります。スレッドはこのモニターの所有権を解放し、notifyメソッドまたはnotifyAllメソッドのいずれかを呼び出して、このオブジェクトのモニターで待機しているスレッドにウェイクアップするように別のスレッドが通知するまで待機します。次に、スレッドはモニターの所有権を再取得できるようになるまで待機し、実行を再開します。

Javaの同時実行性についてもう少し読むことをお勧めします。具体的には、保護されたブロックに関するこのセクションです。

待機して通知するオブジェクトを具体的に指定するのがより一般的です。wait()呼び出しは実際に行われる必要がthis.wait()あり、どのthis.notifyAll()ロックが影響を受けているかを簡単に把握できるようになります。

于 2012-09-13T04:56:03.220 に答える