[解決済み] 非同期静的メソッドは、静的クラス変数を変更しないのであれば、スレッドセーフですか?
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つのスレッドが同時に同じオブジェクトインスタンスを変更することができ、レースコンディションと可視性の問題が発生します。
関連
-
javaの模造品QQ WeChatのチャットルーム
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] 既存の静的クラスに拡張メソッドを追加することはできますか?
-
[解決済み】atomic / volatile / synchronizedの違いは何ですか?
-
[解決済み] Java synchronized method lock on object, or method?
-
[解決済み] 何がメソッドをスレッドセーフにするのか?そのルールは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
プロローグでのコンテンツは禁止されています
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)