使用IoDH的單例寫法,靜態內部類的instance變數是否一定需要聲明為final?
01-05
一般而言,這種方式見得最多的寫法是static final,那麼final是否是必須的呢?
public class Singleton {
private Singleton() {
}private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
多個線程調用靜態方法getInstance()時,JVM也只會載入和初始化內部類一次,將靜態變數INSTANCE定義不可變的final是否必須?
根據JVM規範,Java類只會被初始化一次;在初始化的時候會對被初始化的類對應的Class對象加對象鎖(相當於synchronized (MyClass.class)),而Java的對象鎖(monitor)是有memory barrier語義的,所以這裡LazyHolder.INSTANCE加final對於保障程序順序或者內存狀態可見性來說不是必要的。
主要還是為了防止自己手賤吧。不應該改變的引用,給加上final來修飾也挺好的。
final有的時候是很重要的,有同步語義。在這個特定的場景下,好像不是必須。不過我覺得加了更優雅。
不是必須,當前場景下final只是用來保證這個類屬性在類初始化以後不會被重新賦值。不會影響其在多線程之下的行為。
不一定啊
推薦閱讀:
※環境藝術設計是什麼?
※AngularJS中的依賴注入實際應用場景?
※C#有哪些有名的依賴注入的框架?
※設計模式有何不妥,所謂的荼毒體現在哪?