想象一下两个简单的 java 应用程序。他们都实现了同一个 JAR 文件,其中包含一个像这样的枚举文件:
enum enum1{
value1;
}
在这两个应用程序中,我都打印了 enum1.value1 的哈希码。
System.out.print(enum1.value1.hashCode());
即使两个应用程序实现的 JAR 文件相同,由于哈希码不相等,JVM 是如何工作的?
为什么哈希码不相等,因为它是两个应用程序实现的同一个 JAR 文件?
编辑
我有两个访问数据库的应用程序。它们在同一个 JVM 中运行。我想实现一种锁定机制,以便当应用程序 1 写入数据库时,应用程序 2 必须等待轮到它(即当应用程序 1 释放锁时)。如果可能的话,我的解决方案是创建一个声明了一些 ReentrantLocks 的接口或一个应该充当锁并由两个应用程序使用的枚举。但是接口/枚举的实例在两个应用程序中应该是相等的,因为你只能同步同一个对象。
编辑 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 -jar app1”和“java -jar app2”一样运行,因此它们运行时有两个进程。
但是它们打印不同的哈希码,也就是我相信的(如果我错了,请纠正我),因为它们是由不同的类加载器加载的。但是当我在两个应用程序中打印类加载器时,神秘感就来了:
System.out.print(ClassLoader.getSystemClassLoader().hashCode());
然后哈希码在两个应用程序中是相等的。