1. ホーム
  2. java

[解決済み] 非同期静的メソッドは、静的クラス変数を変更しないのであれば、スレッドセーフですか?

2022-05-03 20:28:35

質問

というスタティックなメソッドがあるかと思いきや ではなく 同期化されているが ない 静的変数を変更した場合、スレッドセーフになりますか?そのメソッド内でローカル変数を作成した場合はどうでしょうか?たとえば、次のコードはスレッドセーフですか?

public static String[] makeStringArray( String a, String b ){
    return new String[]{ a, b };
}

2つのスレッドがこのメソッドを継続的かつ同時に呼び出した場合、1つは犬(例えば "グレート・デーン" と "雄犬" )、もう1つは猫(例えば "ペルシャ" と " シャム" )であるとして、猫と犬を同じ配列で取得できますか。あるいは、猫と犬が同時に同じメソッドを呼び出すことはないのでしょうか?

解決方法は?

このメソッドは100%スレッドセーフで、そうでない場合でもそうなります。 static . スレッドセーフの問題は、スレッド間でデータを共有する必要がある場合に発生します。アトミック性、可視性などに気を配る必要があります。

このメソッドが動作するのは パラメータはスタック とヒープ上のイミュータブルオブジェクトへの参照です。 スタックは本質的にスレッドにローカル そのため、データの共有は一切発生しません。

イミュータブルオブジェクト( String というのも、一度作成された値は変更できず、すべてのスレッドが同じ値を見ることができるからです。一方、もしメソッドが(ミュータブル)である Date 問題が発生した可能性があります。2つのスレッドが同時に同じオブジェクトインスタンスを変更することができ、レースコンディションと可視性の問題が発生します。