2012-05-02 19 views
1

以下の回答に基づいて: それでも私にはわかりません:もしあれば、concurrentMapの同期コンストラクトは何をしますか?すなわち、同時マップの場合、同期された(マップ)対非同期の間の違いは何か。 私は解決策の正当性や信念には興味がありません。質問への回答: Q:並行したマップでの同期と同じではない同期の違いは何ですか?パフォーマンスに関して特に...十分です。何もしてください。
私は何が起こるかにのみ興味があり、補足的なアドバイスはありません。同期コレクションで同期化 - >パフォーマンスの問題

私は、精神的な問題を解決するための理論的な質問があります。 Concurrent Collectionクラスが=> ConcurrentHashMap mapと仮定します。

私は三つの方法があると仮定:


  • TestCase1:

    method1: synchronized(map){ 
         doSomethingWithThemap(); //Assume put integers 1.. 1000000 
    } 
    
    method2:doSomethingWithThemap(); //Note it is not synchronized 
    method3:doSomethingElseWithThemap(); //Assume put integers 2000000.. 3000000 
    

    を次に2つのテストケースを想定& B. Aは、法1を呼び出し、Bが法3を呼び出す2スレッドを生成します。

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

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

私のユニットテストこの仮説は検証しないでください。

Q:ここでは何が欠けていますか?つまり、同時収集で同期ブロックが与えられると、パフォーマンスには全く影響がありませんか?

+0

method1は100万の整数をマップに入れ、method2は何をしますか? – esej

+0

同期していないブロックと全く同じものです。 –

答えて

2

Q:ここでは何が欠けていますか? ConcurrentHashMapは内部自体に同期すること

あなたの仮定が正しくありません:the source codeによると、実装がjava.util.concurrent.locksオブジェクト、コレクションの中に隠されているのインスタンスを使用していますので、あなたはそれらに同期する/ロックすることはできません。

一般に、これはクラスライブラリのライターが従うべき推奨事項です。オブジェクトに対して同期する必要がある場合は、thisで同期しないでください。クラス内にプライベートオブジェクトを作成し、代わりにそのオブジェクトと同期させます。それ以外の場合は、オブジェクト上で同期された他のユーザによって引き起こされる並行性の問題に直面している可能性があり、ロックを無期限に保持している可能性があります。

+0

'ConcurrentHashMap'のポイントは、マップを扱うために保持しなければならない単一のグローバルロックを持っていないことです。同時に複数のスレッドに書き込みと読み込みを同時に行うことができます。そのため、 'Hashtable'と' Maps.synchronizedMap(HashMap) 'が望ましいです。 –

+0

まだわかりません:何かがあれば、concurrentMapの同期コンストラクトは何をしますか?すなわち、同時マップの場合、同期された(マップ)対非同期の間の違いは何か。 私は解決策の正当性や信念には興味がありません。私はそれが何であるかに興味があります。 –

+0

@OlivierTwistあなたのケースでは、あなたのスレッドだけが同期しているので、何もしません。 'concurrentMap'は他のものと同期します。これは実装の内部です。 'concurrentMap'で他のスレッドが同期していた場合、これらのスレッドのうちの1つだけが同期ブロックを実行します。ただし、他のnull以外のオブジェクトでも同期できます。あなたの 'concurrentMap'であるという事実は完全に無関係です。 – dasblinkenlight

0

ConcurrentHashMapがそのインスタンスをモニターとして使用するという保証はありません。それは非常にロックするために他のオブジェクトを使用することがあります!など、

private Object lock = new Object(); 

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

ConcurrentHashMapのは、ロックを使用しないことも可能ですが、むしろのようないくつかの他の並行処理プリミティブはセット比較-と-、セマフォ

Javaのロックはリエントラントなので、すでにロックを保持している場合は、自分自身をブロックしません。

0

ConcurrentHashMapは同期を使用していません...スレッドは安全ですが、たとえば呼び出しを取得すると何もロックされません。並行したデータ構造はとても面白く面白いです。特定の状況下で内部ロックを使用しますが、公開されているものではなく、オブジェクトのモニタ自体を公開していないものはありません。

ところで、このような並行コードのパフォーマンスを測定することはややこしいことであり、実行ごとに変わることになりますが、コンピュータにはほとんど違いがあります。

しかし、それ以外の場合は、同期ハッシュマップを使用すると説明したように理論​​的には機能します。 Collections.synchronizedMap(yourMap);

0
What does the synchronized construct on the concurrentMap do, if anything 

単に時間と空間を浪費します。 ConcurrentMapはすでに同時性を扱う別の手段を具体化している。