- 同期コレクションよりも同時コレクションを使用する理由
コレクションは、synchronized
同時アクセスによる破損からデータを保護するだけだからです。synchronized
これは、コレクションが同時アクセス用に最適化されているという意味ではありません。実際、aは読み取りのために全体をロックConcurrentMap.putIfAbsent
するよりもはるかに優れたメカニズムです。compareAndSet
Map
- 明示的なロックよりもアトミック クラスを優先する必要があるのはいつですか?
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() の代替手段は何ですか?
await
、signal
およびsignalAll
- CompletionService はいつ使用する必要がありますか?
完了サービスは、計算が送信された時点で計算の結果の消費にアクセスする必要はないが、計算の完了 (またはその結果、または成功) を確認することが重要な場合に役立ちます。あなたのプログラムによって知られています。これは、たとえば、失敗したタスク (例外をスローした) の割合を監視するため、またはリソースのクリーンアップのためである可能性があります。