2

Java EE アプリケーションで静的メソッドを使用すると、どのような影響があるのだろうと思っていました。

例: 日付の変換、文字列の並べ替えなどを処理する
クラスがあります。このクラスのすべてのメソッドは静的です。
これらのメソッドはサーブレットで使用されます。

これは、静的メソッドがスレッドセーフである必要があることを意味しますか (多くのユーザーが同時にアプリケーションを使用し、同時に静的メソッドにアクセスすると、いくつかの問題が発生する可能性があります)。

編集Web アプリケーションのコンテキストでこれについて知りたいのですが、2 人のユーザーが同時に静的メソッドをヒットし、(静的メソッドの) 互いの結果を台無しにしますか?

4

3 に答える 3

4

共有クラス変数がない限り、メソッドへの並列アクセスは問題ありません。たとえば、メソッドが独自のものを宣言する場合は、問題ありません。

public static void thing() {
    String x = "";
    // do stuff with x
}

上記は問題ありません。

String x = "";

public static void thing() {
    // do stuff with x
}

これはそうではありません。

于 2012-09-07T14:06:41.417 に答える
2

これは、静的メソッドがスレッドセーフである必要があることを意味しますか (多くのユーザーが同時にアプリケーションを使用し、同時に静的メソッドにアクセスすると、いくつかの問題が発生する可能性があります)。

共有状態がある場合のみ。呼び出しごとにヒープに新しいオブジェクトを割り当てている場合、それは問題ではありません。

しかし、共有状態を導入するとすぐにスレッドセーフの問題が発生することになるため、この種のことを行うのは決して好きではありません。私は、コンバーター/ヘルパー クラスのインスタンスを作成することを好みます (オブジェクトの作成は通常、パフォーマンスの点で無視できます)。これはすぐに、(状態を共有していなければ) スレッドセーフであることを意味し、各インスタンスは (たとえば) 構築時にカスタマイズ可能で、必要に応じてさまざまな動作を与えることができます。

于 2012-09-07T14:04:42.257 に答える
1

もちろん、静的メソッドを保護せずに状態を変更すると、問題が発生します。

このサンプルを検討してください

public class GlobalCount {

    private int count = 0;
    public static void increment() {
       count++; // that is : count = count + 1 (which means some thread may use the old value of count when assigning)
    }
}

複数のスレッドが を呼び出す場合increment、インクリメントがいくらか失われる可能性があります (つまりcount、インクリメント メソッドが呼び出された回数よりも少ない可能性があります。

したがって、メソッドを synchronized として設定する必要があります:

public static synchronized void increment() {
       count++;
    }

共有状態がないと思われる場合は、注意してください。多くの標準クラス (たとえば、日付の書式設定について話しているSimpleDateFormat ) はスレッドセーフではなく、インスタンスが複数のスレッドから呼び出されると失敗する可能性があります同時に。

そのため、複数のスレッドから静的インスタンスにアクセスする場合は、十分に注意してください。

于 2012-09-07T14:05:31.567 に答える