多次初始化的静态最终字段
Static final field initialized multiple times
假设一个 java 项目包含 2 个应用程序。对于它们中的每一个:一个 class 和一个启动应用程序的主要方法,比方说 Main1 和 Main2。
这两个应用程序都使用包含最终静态字段的共享服务 class:
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 都有自己的服务版本:
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 个线程使用 class 服务的经验。输出不同:time
只初始化了一次。我有点难以理解这一点。任何人都可以帮助我了解幕后发生的事情吗?
Main1
和 Main2
在系统级别上是完全独立的进程,并且是独立的 JVM。同一 JVM 中的线程 运行,这就是值相同的原因。
要让 2 个 JVM 看到相同的值,该值需要在外部的某个地方 - 网络、磁盘、windows 注册表,任何东西,但不能在外部。
对于您期望的行为,您需要比简单的 static
(例如 Hazelcast)更强大的机制。
是的,当然这两个程序都有自己的 Service
版本。一次是第一个程序的静态变量,一次是第二个程序的静态变量。
Service
不会有相同的记忆。时差只是你程序的迭代工作。
如果您只想拥有 1 个 Service
,您可以使用 singleton pattern。但这必须在同一个程序中。
假设一个 java 项目包含 2 个应用程序。对于它们中的每一个:一个 class 和一个启动应用程序的主要方法,比方说 Main1 和 Main2。 这两个应用程序都使用包含最终静态字段的共享服务 class:
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 都有自己的服务版本:
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 个线程使用 class 服务的经验。输出不同:time
只初始化了一次。我有点难以理解这一点。任何人都可以帮助我了解幕后发生的事情吗?
Main1
和 Main2
在系统级别上是完全独立的进程,并且是独立的 JVM。同一 JVM 中的线程 运行,这就是值相同的原因。
要让 2 个 JVM 看到相同的值,该值需要在外部的某个地方 - 网络、磁盘、windows 注册表,任何东西,但不能在外部。
对于您期望的行为,您需要比简单的 static
(例如 Hazelcast)更强大的机制。
是的,当然这两个程序都有自己的 Service
版本。一次是第一个程序的静态变量,一次是第二个程序的静态变量。
Service
不会有相同的记忆。时差只是你程序的迭代工作。
如果您只想拥有 1 个 Service
,您可以使用 singleton pattern。但这必须在同一个程序中。