1

以下の回答に基づく:それはまだ私には明らかではありません:concurrentMapの同期された構成は、もしあれば、何をしますか。つまり、コンカレントマップの場合、同期(マップ)と非同期の違いは何ですか。私は解決策の正しさや信じられている良さに興味がありません。質問への答え:Q:コンカレントマップで同期する場合と同期しない場合の違いは何ですか?特にパフォーマンスに関しては..で十分です。これ以上何もしないでください。
私は何が起こるかだけに興味があり、補足的なアドバイスはありません。

少し精神的な問題を解決しているという理論上の質問があります。ConcurrentCollectionクラスsay=>ConcurrentHashMapマップがあると仮定します。

私には3つの方法があると仮定します。

method1: synchronized(map){
       doSomethingWithThemap(); //Assume put integers 1.. 1000000
}

method2:doSomethingWithThemap(); //Note it is not synchronized 
method3:doSomethingElseWithThemap(); //Assume put integers 2000000.. 3000000

ここで、2つのテストケースを想定します。


  • TestCase1:2つのスレッドAとBを生成します。Aはmethod1を呼び出し、Bはmethod3を呼び出します。
  • TestCase2:2つのスレッドA'とB'を生成します。A'はmethod2を呼び出し、B'はmethod3を呼び出します。

パフォーマンスの観点から、TestCase2が勝つことを期待します。私が理解していることから、同期されたブロックがマップのロックを保持するため、TestCase1 Bは同時ではありますが、マップに追加できません。これは、 TestCase2。

私のユニットテストはこの仮説を検証しません。

Q:ここで何が欠けていますか。つまり、concurrentcollectionで同期されたブロックが与えられた場合、パフォーマンスはまったく影響を受けませんか?

4

4 に答える 4

2

Q:ここで何が欠けていますか。

内部的に同期するという仮定ConcurrentHashMapは正しくありません。ソースコードによると、実装はjava.util.concurrent.locksオブジェクトを使用し、そのインスタンスはコレクション内に隠されているため、それらをロック/同期することはできません。

一般に、これはクラスライブラリの作成者が従うべき推奨事項です。オブジェクトで同期する必要がある場合は、this;で同期しないでください。クラス内にプライベートオブジェクトを作成し、代わりにそのオブジェクトで同期します。そうしないと、オブジェクトで同期されている他のユーザーが原因で同時実行の問題が発生し、ロックが無期限に保持される可能性があります。

于 2012-05-02T00:10:49.667 に答える
0

ConcurrentHashMapがそのインスタンスをモニターとして使用するという保証はありません。他のオブジェクトを使用してロックする可能性があります。

private Object lock = new Object();

synchronized(lock) {
   // do some stuff - you can't get my lock because it is private
}

ConcurrentHashMapがロックを使用せず、比較と設定、セマフォなどの他の同時実行プリミティブを使用する可能性もあります。

Javaのロックは再入可能であるため、すでにロックを保持している場合は、自分自身をブロックすることはありません。

于 2012-05-02T00:14:49.700 に答える
0

ConcurrentHashMapは同期を使用していません...それでもスレッドセーフですが、たとえばget呼び出しは何もロックしていません。並行データ構造は非常に素晴らしく、興味深いものです。それは、特定の状況下でいくつかの内部ロックを使用しますが、公開されるものは使用せず、オブジェクトのモニター自体を公開しないことは確かです。

ところで。このような同時コードパフォーマンスの測定はかなりトリッキーで、実行ごとやコンピューターごとに異なりますが、とにかくほとんど欠陥があります。

ただし、そうでない場合は、代わりに同期ハッシュマップを使用すると、理論的には説明どおりに機能する可能性があります。Collections.synchronizedMap(yourMap);

于 2012-05-02T00:18:01.423 に答える
0
What does the synchronized construct on the concurrentMap do, if anything

時間とスペースを無駄にするだけです。ConcurrentMap並行性を処理するための代替手段をすでに具体化しています。

于 2012-05-02T10:07:58.347 に答える