5

私は Java Concurrency in Practice を読みました。これは素晴らしいリファレンスですが、java.util.concurrent パッケージのユース ケースの簡潔な 1 ページの要約を見たいと思います。

例えば:

  • 同期コレクションよりも同時コレクションを使用する理由
  • 明示的なロックよりもアトミック クラスを優先する必要があるのはいつですか?
  • 同期でロックを使用する必要があるのはいつですか?
  • wait() と notify()、notifyAll() の代替手段は何ですか?
  • CompletionService はいつ使用する必要がありますか?

知っておくべき長所/短所と落とし穴は何ですか?

4

2 に答える 2

11
  • 同期コレクションよりも同時コレクションを使用する理由

コレクションは、synchronized同時アクセスによる破損からデータを保護するだけだからです。synchronizedこれは、コレクションが同時アクセス用に最適化されているという意味ではありません。実際、aは読み取りのために全体をロックConcurrentMap.putIfAbsentするよりもはるかに優れたメカニズムです。compareAndSetMap

  • 明示的なロックよりもアトミック クラスを優先する必要があるのはいつですか?

AtomicIntegerクラスとクラスはAtomicLong、より簡潔であるため、プリミティブを使用して手動でロックするよりも(私の意見では)常に使用する必要があります。検討:

synchronized (lock) { 
    int old = counter;
    counter++;
    return old;
}

比較すると:

int old = counter.getAndIncrement();

ただし、クラスは待機性の欠如に苦しんでいると言わざるを得ませ。たとえばwait、ブール条件で同期されたブール値が必要になることがよくあります。これらはWaitableBoolean、古い Doug Lea 同時実行ライブラリと同じように利用できましたが、.NET では放棄されましたj.u.c。理由はわかりません。

  • 同期でロックを使用する必要があるのはいつですか?

Locksを使用するとオーバーヘッドが生じるため、これはより複雑な質問です。実際、通常ReadWriteLockの場合、aを使用してもパイントはないとよく言われます。ロックを使用しなければならないシナリオの 1 つは、リソースのロックとそのロック解除を同じレキシカル スコープで実行できない場合です。このような場合、助けることはできません。synchronized

  • wait() と notify()、notifyAll() の代替手段は何ですか?

awaitsignalおよびsignalAll

  • CompletionService はいつ使用する必要がありますか?

完了サービスは、計算が送信された時点で計算の結果の消費にアクセスする必要はないが、計算の完了 (またはその結果、または成功) を確認することが重要な場合に役立ちます。あなたのプログラムによって知られています。これは、たとえば、失敗したタスク (例外をスローした) の割合を監視するため、またはリソースのクリーンアップのためである可能性があります。

于 2009-09-04T06:35:34.543 に答える
2
What are the alternatives to wait() and notify(), notifyAll()

wait ()、notify()notifyAll()の非常に優れた代替手段の 1 つは、NOT USE THEM AT ALLです。

200KLOC のコードベースは、高度にマルチスレッド化されています。私たちは無数のコアに負荷を分散しており、大量の生産者/消費者スキームなどを持っています.

コード内に wait()、notify()、またはnotifyAll()インスタンスはありますか?

ゼロ。

私は、それが高度にマルチスレッド化されたアプリケーションであるという事実を強調し直しました: *ラッチ、ポイズンピル、java.util.concurrent.** などなど。ただし、wait()、notify()またはnotifyAll() : ゼロ インスタンス。

これは、同時実行ユーティリティ/フレームワークでのみ使用する必要がある、本当に低レベルのものです。

Joshua Bloch の「Effective Java」の「Threads」の章の冒頭に次のように書かれています。

「低レベルのマルチスレッド プログラミングを省略できるライブラリがある場合は、ぜひそれを使用してください。」

于 2010-03-29T20:14:03.270 に答える