0

次のコードをWebサービスの一部として実行しているとしましょう。コードはスレッドセーフである必要があります。たとえば、他のWebサービス呼び出しが別のインスタンスの変数を変更することはできません。このコードはこの要件を満たしていますか?

public class ExampleClass {

   public static String abc = "000";
   public static ArrayList<String> myList = new ArrayList();

   public static synchronized final void clearList(){
   mylist.clear();
   } 
   public static synchronized final void addToList(String listItem){
   myList.add(listItem);
   }

   ...

   more static synchronized methods...

}

私はこのコードを継承し、同期を確実にするために最小限の変更を加える必要があります。

あなたの答えに感謝します。

[編集]明確にするため。このコードを実行する際にWebサービス呼び出しが発生し、「abc」変数と「myList」変数を処理します(変更など)。その間に、別のWebサービス呼び出しが着信し、これらの変数の処理も開始されます。ただし、これら2つの個別のリクエストには、独自の「abc」変数と「myList」変数が必要です。たとえば、これらを共有できない場合、結果は正しくありません。

4

4 に答える 4

3

いいえ。あなたのString abcand ArrayList myListは、別のクラスから明らかにアクセスできます。それらを作成しますprivate(できれば非static)。

于 2013-02-27T16:44:24.487 に答える
2

[編集: 補遺]

スレッド セーフは単なる表現であり、絶対的な用語ではありません。何を意味するかを定義しない限り、助けるのは難しい.

たとえば、「abc」がどのようにアクセスされ、何を期待しているのかを説明していません。たとえば、abc とリストへの変更をアトミックにする必要がある場合は、それらにアクセスするコードを単一の同期ブロックにラップする必要があります。「abc」が変更されない場合は、スレッドセーフにするために何も追加する必要はありません。その場合は、すべての変更と読み取りを同期ブロックにラップする必要があります (そうしないと、厄介な可視性の問題が発生します)。また、abc を変更するスレッドが 1 つしかない場合は、それを揮発性にしても問題ありません。

2 つの問題は次のとおりです。

  • myList は公開されているため、それを使用するコードについて保証したり、仮定したりすることさえ困難です。非公開にすれば、少なくとも自分のメソッドについて心配するだけで済みます。メソッドの同期をスキップして、次の行に直接進むこともできます。 myList = Collections.synchronizedList(new ArrayList()); このようにして、すべてのメソッドが myList オブジェクトで同期されます。そうする場合は、myList を final にする必要があります (誰も非同期バージョンに切り替えることができないようにするため)。
  • あなたの説明:「他のWebサービス呼び出しは別のインスタンスで変数を変更できません」は、スレッドセーフであることとは何の関係もありません。便利な方法 (public static メソッド) を提供しているため、誰でも myList 内のすべてを変更できます。また、ExampleClass のすべてのインスタンスは myList を共有し、単一のインスタンスを変更します。ポイントは、変更がスレッドセーフになることです。
于 2013-02-27T16:52:45.467 に答える
1

変数は公開されているので、いいえ。それらを非公開にします。リスト オブジェクトを返すメソッドがある場合は、防御的にリストをコピーするように変更する必要があります。

于 2013-02-27T16:49:02.003 に答える
0

可能であれば、同期されたコレクションを使用してください。

于 2013-02-27T16:58:59.267 に答える