多次初始化的静态最终字段

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 只初始化了一次。我有点难以理解这一点。任何人都可以帮助我了解幕后发生的事情吗?

Main1Main2 在系统级别上是完全独立的进程,并且是独立的 JVM。同一 JVM 中的线程 运行,这就是值相同的原因。

要让 2 个 JVM 看到相同的值,该值需要在外部的某个地方 - 网络、磁盘、windows 注册表,任何东西,但不能在外部。

对于您期望的行为,您需要比简单的 static(例如 Hazelcast)更强大的机制。

是的,当然这两个程序都有自己的 Service 版本。一次是第一个程序的静态变量,一次是第二个程序的静态变量。

Service不会有相同的记忆。时差只是你程序的迭代工作。

如果您只想拥有 1 个 Service,您可以使用 singleton pattern。但这必须在同一个程序中。