想象一个包含2个应用程序的java项目。对于它们中的每一个:具有用于启动应用程序的main方法的类,例如Main1和Main2。 两个应用程序都使用包含最终静态字段的共享Service类:
public class Main1 {
public static void main(String[] args) throws InterruptedException {
for (int i =0;i<3;i++){
System.out.println("I'm application number 1. Time =" + Service.time);
sleep(1000);
}
}
}
public class Main2 {
public static void main(String[] args) throws InterruptedException {
for (int i =0;i<3;i++){
System.out.println("I'm application number 2. Time =" + Service.time);
sleep(1000);
}
}
}
public class Service {
public final static LocalDateTime time = LocalDateTime.now();
}
我对输出感到惊讶。看来Main1和Main2各自都有自己的Service版本:
I'm application number 1. Time =2020-07-13T17:04:55.155497300
I'm application number 1. Time =2020-07-13T17:04:55.155497300
I'm application number 1. Time =2020-07-13T17:04:55.155497300
I'm application number 2. Time =2020-07-13T17:04:58.800497300
I'm application number 2. Time =2020-07-13T17:04:58.800497300
I'm application number 2. Time =2020-07-13T17:04:58.800497300
我重复了2个线程使用Service类的经验。输出结果不同:time
仅初始化一次。我有点难以理解。谁能帮助我了解幕后发生的事情?
答案 0 :(得分:1)
Main1
和Main2
在系统级别是完全独立的进程,并且是独立的JVM。线程在同一JVM中运行,这就是为什么值相同的原因。
要使2个JVM看到相同的值,则该值必须位于外部某个位置-网络,磁盘,Windows注册表,除外部之外的所有对象。
对于您期望的行为,您将需要比简单的static
(例如Hazelcast)更强大的机制。
答案 1 :(得分:1)
是的,当然,这两个程序都有自己的Service
版本。一次它是第一个程序的静态变量,而另一个是第二个程序的静态变量。
Service
将没有相同的内存。时间差只是程序的迭代工作。
如果您只想拥有1个Service
,则可以使用singleton pattern。但这必须在同一程序中。