-1

このコードでは、メソッドを同期するだけで十分ですか? どうもありがとう。

class{
   private static VariableManager = new VariableManager();


   ...

   static class VariableManager{
       private Map<String, Integer> diffCases = new HashMap<String,Integer>();
       private int count=0;

       public synchronized VariableManager get(){
            return this.
       }

       public synchronized  void add(String case, Integer i){
          diffCases.put(case, i);
       }

       public synchronized void increment(){
          c++;
      }
   }
}

public static synchronized void process(){

     ...
     variableManager.add(case, num);
     variableManager.count();

}

プログラムが期待どおりに動作せず、2 つの静的変数が何らかの形で保護されていないと思われます。1つのスレッドを使用すると、うまく機能します。

手がかりはありますか?どうもありがとう。

2 つのスレッドは、同じイベント配列「eventsArray」を処理しています。「プロセス」メソッドでは、2 つの変数が同期メソッドで変更されます。

もう少し提供するには:

         Thread e1 = new Thread(new EventThread(eventsArray, "e1"));
         e1.start();

         Thread e2 = new Thread(new EventThread(eventsArray, "e2"));
         e2.start();

         e1.join();
         e2.join();
4

1 に答える 1

1

静的変数の一貫性を守るには、それらへの各アクセスを同じロックを使用して同期する必要があります。これには、変数の読み取りが含まれます。静的変数が、示したメソッドでのみ使用される場合は、それで十分です。

countまたはが使用されている場所が他にある場合diffcasesは、アクセスが常に同じモニター (つまり、静的変数を囲むクラス オブジェクト) を使用して同期されていることを確認する必要があります。これは、変数を「読み取るだけ」の場合にも当てはまります。

*コードに : が含まれていることに注意してくださいdiffcases.add(case).add()マップには移動できません。それは本当のコードですか?

スレッドセーフなアクセスを許可するように設計されたオブジェクト内の静的変数を非表示にすることを検討してください。これにより、同時実行を認識するコードがカプセル化されます。スレッド間で静的変数を共有すると、多くの場合、バグの原因になります。

于 2013-04-13T16:04:10.833 に答える