簡體   English   中英

Static 最終字段多次初始化

[英]Static final field initialized multiple times

想象一個包含 2 個應用程序的 java 項目。 對於它們中的每一個:一個 class 和一個 main 方法來啟動應用程序,比如說 Main1 和 Main2。 兩個應用程序都使用共享服務 class 包含最終 static 字段:

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();
}

我對 output 感到有些驚訝。 似乎 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 個線程使用 class 服務的經驗。 output 不同: time僅初始化一次。 我有點難以理解這一點。 誰能幫助我了解幕后發生的事情?

Main1Main2在系統級別上是完全獨立的進程,並且是獨立的 JVM。 線程在同一個 JVM 中運行,這就是值相同的原因。

要讓 2 個 JVM 看到相同的值,該值需要位於外部的某個位置 - 網絡、磁盤、windows 注冊表等等,但不在外部。

對於您期望的行為,您需要比簡單的static (例如Hazelcast )更強大的機制。

是的,當然這兩個程序都有自己的Service版本。 一次是第一個程序的 static 變量,另一次是第二個程序的 static 變量。

Service不會有相同的 memory。 時差只是您的程序的迭代工作。

如果您只想擁有一項Service ,您可以使用singleton 模式 但這必須在同一個程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM