JVM是否在两个单独的实例中实现了不同的应用程序?

时间:2012-06-26 07:43:24

标签: java jar jvm

想象一下两个简单的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中,我打印了commons实例hashcode:

System.out.println(Commons.getInstance().hashCode());

两个java应用程序都像“java -jar app1”和“java -jar app2”一样运行,因此运行时有两个进程。

但是他们打印了不同的哈希码,也就是我所相信的(如果我错了就纠正我),因为它们已被不同的类加载器加载。但是当我在两个应用程序中打印类加载器时,神秘主义者到了:

System.out.print(ClassLoader.getSystemClassLoader().hashCode());

然后两个应用程序中的哈希码相等。

4 个答案:

答案 0 :(得分:2)

目前尚不清楚您是否在同一流程中讨论两个应用程序。即使你是这样,如果这两个应用程序有单独的ClassLoader实例加载相同的jar文件,那么就JVM而言,两个枚举类型是不同类型。如果您想在两个应用程序使用的进程中使用类型,则必须由单个类加载器加载。

答案 1 :(得分:1)

请参阅Javadoc Object.hashCode()

  

hashCode的一般合约是:

     
      
  1. 每当在同一个对象上多次调用时   执行Java应用程序时,hashCode方法必须始终如一   如果没有在equals中使用的信息,则返回相同的整数   对象的比较被修改。 不需要保留此整数   从一个应用程序的执行到另一个执行的一致性   相同的申请。

  2.   
  3. 如果两个物体相等则   equals(Object)方法,然后在每个上调用hashCode方法   两个对象必须产生相同的整数结果。

  4.   
  5. 如果两个对象不相等则不需要   equals(java.lang.Object)方法,然后调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。   但是,程序员应该意识到产生了不同的   不等对象的整数结果可以提高性能   哈希表。

  6.   

另外

  

这通常是通过转换内部地址来实现的   将对象转换为整数

所以你的结果对我来说似乎是完全合法的。如果您需要哈希码是一致的,那么您可能做错了,因为API不打算以这种方式使用。也许你可以告诉你的目标。

答案 2 :(得分:0)

将JAR视为包含可以运行的应用程序的配方的静态资源。实际运行应用程序时,使用特定于操作系统的规则将所有资源加载到计算机的内存中。这些规则不强制要在同一个虚拟内存地址中加载类。

答案 3 :(得分:0)

枚举只是一个关键词,它使得声明的类型类(例如枚举日意味着你将拥有像Day extends Enum这样的类),类是一个简单的模板,它将在JVM中构建,它具有它的自己的哈希码很明显,当你创建一个新的对象时,你会得到新的哈希码,这就是为什么你得到新的哈希码 请访问以下链接以获取更多详细信息....

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

观察“所有枚举都隐式扩展了java.lang.Enum。由于Java不支持多重继承,因此枚举不能扩展其他任何内容”这一点很清楚。