2つの単純なJavaアプリケーションを想像してみてください。どちらも、次のような列挙型ファイルを含む同じJARファイルを実装しています。
enum enum1{
value1;
}
どちらのアプリケーションでも、enum1.value1のハッシュコードを出力します。
System.out.print(enum1.value1.hashCode());
2つのアプリケーションが実装するJARファイルが同じであっても、ハッシュコードが等しくないため、JVMはどのように機能しますか?
両方のアプリケーションが実装する同じJARファイルであるため、ハッシュコードが等しくないのはなぜですか?
編集
データベースにアクセスする2つのアプリケーションがあります。それらは同じJVM内で実行されます。アプリケーション1がデータベースに書き込んでいるとき、アプリケーション2が順番を待たなければならないように(つまり、アプリケーション1によってロックが解放されたとき)、ロックメカニズムを実装したいと思います。私の解決策は、可能であれば、いくつかのReentrantLocksが宣言されているインターフェイス、またはロックとして機能し、2つのアプリケーションで使用される列挙型を作成することです。ただし、同期できるのは同じオブジェクトのみであるため、インターフェイス/列挙型のインスタンスは両方のアプリケーションで同じである必要があります。
編集2
これはアーキテクチャです:
App1.jar Commons.jar App2.jar
App1Main.class Commons.class App2Main.class
App1とApp2の両方にCommons.jarが含まれています。commons.classは、単純なシングルトンクラスです。App1とApp2の両方で、コモンズインスタンスのハッシュコードを出力します。
System.out.println(Commons.getInstance().hashCode());
どちらのJavaアプリケーションも「java-jarapp1」と「java-jarapp2」のように実行されるため、実行中のプロセスは2つあります。
しかし、それらは異なるハッシュコードを出力します。つまり、異なるクラスローダーによってロードされているため、私が信じていることです(間違っている場合は修正してください)。しかし、両方のアプリでクラスローダーを印刷すると、神秘的なものが到着します。
System.out.print(ClassLoader.getSystemClassLoader().hashCode());
その場合、ハッシュコードは両方のアプリケーションで等しくなります。