1. ホーム
  2. java

[解決済み] ユーティリティ静的メソッドのスレッドセーフを確保するには?

2023-07-18 17:40:41

質問

アプリケーションのさまざまなユーティリティクラスで使用される静的メソッドのスレッドセーフを確保するための、一般的な方法やルールはありますか? ここでは、特に Web アプリケーションのスレッドセーフを指摘したいと思います。

Immutable Objectsをパラメータとする静的メソッドはスレッドセーフであり、Mutable Objectsはそうでないことはよく知られています。

を操作するためのユーティリティメソッドがあるとします。 java.util.Date のインスタンスを受け取り、そのメソッドが java.util.Date のインスタンスを受け取る場合、このメソッドはスレッドセーフではありません。では、パラメータ渡しの方法を変えずにスレッドセーフにするにはどうしたらよいでしょうか。

public class DateUtils {

    public static Date getNormalizeDate(Date date) {
        // some operations
    }   
}

また、クラス javax.faces.context.FacesContext はミュータブルですか?このような静的なユーティリティメソッドにこのクラスのインスタンスを渡すことはスレッドセーフですか?

パラメータとして渡すことができる、またはできないクラスのインスタンスのリストは長くなる可能性があります。

どのように解決するのか?

immutableなオブジェクトをパラメータとする静的メソッドはスレッドセーフであり、mutableなオブジェクトはスレッドセーフでないことはよく知られています。

私はこれに異議を唱えたい。メソッドに渡された引数はスタックに格納され、これはスレッドごとのイディオムです。

もしパラメータが Date のような変更可能なオブジェクトである場合、他のスレッドが他の場所で同時にそれを変更しないようにする必要があります。しかし、これはメソッドのスレッドセーフとは関係ない別の問題です。

あなたが投稿したメソッドはスレッドセーフです。それは状態を維持せず、その引数に対してのみ動作します。

を読むことを強くお勧めします。 Java並行処理の実践 または、Java のスレッドセーフに特化した同様の本を読むことを強くお勧めします。これは複雑なテーマであり、StackOverflow のいくつかの回答で適切に対処することはできません。