- なぜ同期コレクションに対して並行コレクションを使用するのですか?
コレクションは、同時アクセスによるデータの破損のみを防止するためです。これは、コレクションがであり、同時アクセスのためにに最適化されていることを意味しません。それよりはるかに、ConcurrentMap.putIfAbsent
はcompareAndSet
のほうがはるかに良いメカニズムで、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()の代替手段は何ですか?
await
、signal
と
signalAll
はCompletionServiceを使用する必要がありますか?
完了サービスは、計算の結果の消費が計算が提出された時点でアクセスが、それが重要であるする必要がない場合に有用であるその計算の完了(またはその結果、または成功)をあなたのプログラムによって知ることができます。これは、たとえば、例外を投げた失敗したタスクの割合を監視する場合や、リソースクリーンアップの場合などです。
これは宿題のように聞こえる。 –
実際はありません:)ジョブの正しいツールを選択するためのクイックリファレンスです。 – parkr
あなたは本を読んでも、まだこれらの質問がありますか? – pek