2016-09-26 13 views
0

真にグローバルな変数をJavaで維持する方法を探しています。その1つはJVMインスタンス全体に有効です。本当にグローバルなJavaの状態は、「静的」よりも「グローバル」ですか?

staticフィールドを単にどこかのフィールドに使用した場合、フィールドを含むクラスが異なるクラスローダーによって複数回読み込まれる場合はit will failとなります。

JDK標準クラス(通常は同じクラスローダーによって常にロードされる)のみを使用するか、カスタムMBeanにグローバル状態を維持するように依頼するなど、これを解決するための厄介な方法が考えられますが、私にハックする。

免責事項:私はグローバルな状態が悪いことを知っています。はい、できればいつでも避けています。約束する。

+1

他に何もなければ、自分の燃える好奇心のために、ユースケースを説明してください。 – chrylis

+0

'enum'を使用してください。しかし、あなたが欲しいのは本当にむしろ "un o"です。 –

+0

@BoristheSpider enumソリューションは、静的フィールドソリューションとまったく同じ問題を抱えています。 – chrylis

答えて

1

を参照してください、あなたはシステムクラスローダによってロードされるグローバルオブジェクト、または他の共有クラスローダを必要としています。

どのように設定するかは、アプリの実行方法によって異なります。 Tomcatでは、CATALINA_BASE/libフォルダ内のjarファイルが共有クラスローダに追加されます。

クラスが正しいクラスローダーによってロードされると、staticフィールドはあなたの望むように動作します。

1

私が思いつくことができる唯一の信頼できるアプローチは、コンテナの基本クラスローダを操作することに依存しないということは、JNIを使​​用することです。共有メモリセグメントまたは他の同様のメカニズムを使用してグローバル状態を戻すネイティブコードにアダプタを書き込みます。

2

システムプロパティは、1つのVM全体で使用できますが、クロスプロセスでは使用できません。 1つのVM、1つのプロパティセットあなたの問題は、複数のクラスローダに関連している場合

またScope of the Java System Properties

関連する問題