[英]Can a static final field be initialized in subclasses? If so, how?
[英]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
僅初始化一次。 我有點難以理解這一點。 誰能幫助我了解幕后發生的事情?
Main1
和Main2
在系統級別上是完全獨立的進程,並且是獨立的 JVM。 線程在同一個 JVM 中運行,這就是值相同的原因。
要讓 2 個 JVM 看到相同的值,該值需要位於外部的某個位置 - 網絡、磁盤、windows 注冊表等等,但不在外部。
對於您期望的行為,您需要比簡單的static
(例如Hazelcast )更強大的機制。
是的,當然這兩個程序都有自己的Service
版本。 一次是第一個程序的 static 變量,另一次是第二個程序的 static 變量。
Service
不會有相同的 memory。 時差只是您的程序的迭代工作。
如果您只想擁有一項Service
,您可以使用singleton 模式。 但這必須在同一個程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.