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

时间:2020-07-13 15:16:22

标签: java static initialization static-initialization

想象一个包含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仅初始化一次。我有点难以理解。谁能帮助我了解幕后发生的事情?

2 个答案:

答案 0 :(得分:1)

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

要使2个JVM看到相同的值,则该值必须位于外部某个位置-网络,磁盘,Windows注册表,除外部之外的所有对象。

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

答案 1 :(得分:1)

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

Service将没有相同的内存。时间差只是程序的迭代工作。

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