※ ChatGPTを利用し、要約された質問です(原文:staticのメモリ共有について)
staticのメモリ共有について
このQ&Aのポイント
Javaのstatic変数は、プロセスごとに異なる値を保持することができますが、他のプロセスからの書き換えはできません。
マルチスレッドな処理が行われていない場合、static変数の値の不整合については考慮する必要がありません。
ただし、複数プロセスでシングルスレッドな処理を行っている場合でも、性能などの問題上、static変数の使用には注意する必要があります。
staticについて調べたのですが、その内容があっているのかどうか
間違い・アドバイスなどありましたら是非伺いたいと思います。
よろしくお願い致します。
------------------------------------------------------------
シェルから起動されるJavaでバッチ処理を行うアプリケーションを
作成していまして、サーバマシンの複数のプロセスから起動されます。
(つまりjavaコマンドが複数回同時に実行されます)
1回の実行の間保持しておきたい値をstaticなクラス変数に格納しています。
そしてそれは、1回の実行の間はずっと同じなのですが、
プロセスごとに異なる値です 。
この時、この1回の実行の間に保持しておきたい"static"な変数は
次のプロセスから実行された時に書き換えられるのか?
という疑問がでたのが始まりです。
マルチスレッドの処理はありません。
------------------------------------------------------------
調べたところ、
■1台で2つ以上のJavaアプリケーションを実行する場合、
それぞれのアプリケーションを個別にjavaコマンドで起動・・・
=>javaコマンド毎に"個別のJVMが"それぞれのプロセス上で動作する。
■フィールドをstatic指定するとクラス変数となり、
ロードされたクラスごとに"JVM上に"1つしか存在しない変数となる。
・以上の2点から、staticの変数がメモリ上で共有されるのは
1つのJVM(1プロセス)内での話しであり、他のプロセスから
その値を書き換えられる事はないと考えています。
そして、1プロセス内でのマルチスレッドな処理を行っている場合、
staticな変数の値は注意が必要だけど、
複数プロセスでシングルスレッドな処理を行っている場合、
(性能などの問題上staticにするかどうか良し悪しはあるとしても)
staticな変数の値の不整合について
考慮は不要と考えても宜しいのでしょうか?
経験が浅い為、確信が持てずにいる状況です。
宜しくお願い致します。
お礼
そうですよね。 そうじゃないと開発機なんて大変なことになってしまいますよね。 専門家の方の意見が聞けてとても勉強になりました。 ありがとうございました。