10

のソース コードを読んでいるときに、「どの教科書にもある古典的な 2 条件アルゴリズムArrayBlockingQueue」を使用していることを説明するコメントを見つけました。

/*
 * Concurrency control uses the classic two-condition algorithm
 * found in any textbook.
 */

/** Main lock guarding all access */
private final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;

従来の 2 条件 (notEmpty、notFull) アルゴリズムを使用するのはなぜですか?

4

1 に答える 1

3

あなたはすでに良いコメントをしていました。補足としてのみ。

ArrayBlockingQueueState-Dependentクラスです。これは、このクラスには、いくつかの前提条件でのみ実行できる操作があることを意味します。

書き込みスレッドは、前提条件 (notFull) が false の場合にのみ待機します。

// キューがいっぱいの場合、ライターは待機する必要があります。
// ロックを原子的に解放し、シグナル (リーダーによって起動された notFull.signal()) を待ちます。
while (count == items.length)
notFull.await();

読者の場合、概念は同じですが、notEmpty 条件を使用します。

// キューが空の場合、リーダーは待機する必要があります。
// ロックを原子的に解放し、シグナル (ライターによって起動された notEmpty.signal()) を待ちます。
while (カウント == 0)
notEmpty.await();

スレッドが起動したら、主に 2 つのことが必要です
。1 - ロックを取得する
2 - 状態を再テストする

于 2013-04-14T06:22:08.823 に答える