2009-09-04 12 views
5

Java Concurrency in Practiceを読んだことがありますが、これは参考になりますが、java.util.concurrentパッケージの使用例の簡潔な単一ページの要約をご覧ください。例えばJava並行ユーティリティの使用例

:同期コレクション上で同時コレクションを使用する理由

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

覚えておくべき賛否両論とは何ですか?

+0

これは宿題のように聞こえる。 –

+0

実際はありません:)ジョブの正しいツールを選択するためのクイックリファレンスです。 – parkr

+0

あなたは本を読んでも、まだこれらの質問がありますか? – pek

答えて

11
  • なぜ同期コレクションに対して並行コレクションを使用するのですか?

​​コレクションは、同時アクセスによるデータの破損のみを防止するためです。これは、​​コレクションがであり、同時アクセスのためにに最適化されていることを意味しません。それよりはるかに、ConcurrentMap.putIfAbsentcompareAndSetのほうがはるかに良いメカニズムで、Mapの読み取りをすべてロックするよりも優れています。

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

これらのクラスは、より簡潔であるため、プリミティブで手作業でロックするよりも(私の意見では)常に使用する必要があります。考えてみましょう:

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

と比較した場合:私は言っている

int old = counter.getAndIncrement(); 

、クラスはwaitabilityの欠如に苦しんでいること。たとえば、ブール値の条件にwaitがある場合、同期ブール値が必要な場合があります。これらは古いDoug Lea並行性ライブラリのWaitableBooleanとして入手できましたが、j.u.cで投棄されました。理由はわかりません。

  • 同期は、どのように同期する必要がありますか?

Locksの使用にいくらかのオーバーヘッドがあるため、これはより複雑な質問です。実際、ReadWriteLockを使用する際には、の典型的なの場合には、何もないことがよくあります。 1つのシナリオロックを使用する必要がある場合は、リソースのロックとそのロック解除を同じ語彙スコープで実行できない場所です。​​は、このような場合に役立つ無力です。

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

awaitsignal

  • signalAllはCompletionServiceを使用する必要がありますか?

完了サービスは、計算の結果の消費が計算が提出された時点でアクセスが、それが重要であるする必要がない場合に有用であるその計算の完了(またはその結果、または成功)をあなたのプログラムによって知ることができます。これは、たとえば、例外を投げた失敗したタスクの割合を監視する場合や、リソースクリーンアップの場合などです。

+0

ロックのユースケースの1つは、さまざまなクライアントに対して異なる実装が必要な場合です。たとえば、マルチスレッドクライアントでは、標準のロック、シングルスレッドのnoopロックを使用できます。また、競合状態検出の負荷テストでは、同時アクセスでアボートするロックを使用することもできます。 – user58804

2
What are the alternatives to wait() and notify(), notifyAll() 

1つの非常に良い代替に待機()、()のnotifyAllを通知()はAT ALLには使用しないにあります。

ここに200KLOCコードベースがあります。ひどくマルチスレッドです。私たちは、コード内で)(()またはのnotifyAllを通知し、)(待ちの

インスタンスの無数のコアに負荷を分散し、等の生産/消費者スキームの軍隊を持っていますか?

ゼロ。

重大なマルチスレッドアプリケーションであるという事実に重点を置いています。*ラッチ、毒薬、java.util.concurrent **、およびその他のものはどこでもです。しかし、wait()、notify()またはnotifyAll():ゼロインスタンス。

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

ジョシュア・ブロックから

「効果的なJavaの」で、「スレッド」章の冒頭で:

「低レベルのマルチやってからあなたを救うことができるライブラリが存在する場合スレッドプログラミング、是非それを使用してください。

関連する問題