1

同期に関する簡単な質問があります。これが私が持っているものです。

a)Class1には、次のように定義された同時ハッシュマップがあります。

ConcurrentMap<String, int[][]> map  = new ConcurrentHashMap<String, int[][]>();

b)Class2には、Thread1呼ばれるスレッドがあります。Thread1はIDを作成し、マップにIDが含まれているかどうかを確認します。含まれている場合は、値(int [] [])を取得し、内容を変更して元に戻します。そうでない場合は、新しいint [] []を作成し、それを格納します。このチェック->変更/作成のプロセスは頻繁に発生します。

 private class Thread1 implements Runnable{

            public void run(){
                //keepRunning is volatile
                while( keepRunning ){

                  String id     = "ItemA";
                  int[][] value = map.get(id);

                  //If value is null, create an int[][] and put it back as value for Id
                  //If value is not null, modify the contents according to some logic  
                 }
             }
    }

c)最後に、Thread2という別のスレッドがあります。このスレッドはIDを受け取り、マップにその値があるかどうかを確認します。そうでない場合、何も起こりません。含まれている場合は、int [] []の値を合計し、その数値を計算に使用します(ここでは変更はありません)。

私は自分の操作がアトミックであるかどうかを理解しようとしています。b)の操作は、配列の作成/変更とマップへの挿入が1つのスレッド(Thread1)のみに制限されているため問題ありません。

また、マップへの挿入により、発生前のアクションが確立されるため、c)がint[][]で更新された値を確認できるようになります。

ただし、Thread2がマップ内で同じint [] []を検索し、Thread1が変更しているときにそれを合計しようとすると、どうなるかわかりません。

Thread2がint[][]に古い(ただし破損していない)値を表示すると考えるのは正しいですか。その理由は、Thread1が値をマップに戻すのが完了するまで、新しい変更はThread2に表示されないためです。

どうもありがとう。

4

1 に答える 1

1

操作はアトミックではありません。スレッド1が値を変更している間、スレッド2は値を合計しようとします。

これを回避するには、元のファイルを複製して、複製を変更し、コピーを元に戻す必要があります。

于 2012-08-04T04:35:16.213 に答える