標籤:eth ret 寫法 final blog 適用於 instance 安全 nbsp
最近在網上看到一篇關於 Java 單例的建立問題,雖然是一個 Java 程式員,但是到現在還沒有真正的深入瞭解到 Java 的原理和機制。所以每每看到這樣能夠“真正”接觸 Java 的機會內心總是充滿了欣喜。記錄下,以後備用。
懶漢模式
public class Singlton{ private static Singleton instance; private Singlton(){} public static Singlton getInstance(){ if(instacne == null) instance = new Singlton(); return instance; }}
教科書式的寫法,但是無法適用於多線程的狀態下。
餓漢模式
public class Singleton{ private static Singletion instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; }}
餓漢模式可以有效避免多線程的同步問題,不過使用 static 會多多少少犧牲點效能。
靜態內部類
public class Singleton{ private static class SingltonHolder{ private static final Singleton INSTANCE = new Singlton(); } private Singleton(){} public static final Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
使用靜態內部類的方式,利用 ClassLoder 的機制保證了初始化的時候只有一個線程,並且兼顧了效能——Singleton 類被裝載的時候,getInstance 並不會立馬初始化,只有調用的時候才會被初始化。
枚舉
public enum Singleton{ INSTANCE; public void method(){ //do something }}
這種方式 Effective Java 中推薦的方式,很厲害的一種寫法。唯一的缺點就是無法繼承了吧。
小結
雖然只是創造一個單例,但是其中需要考慮的東西真的有很多。不得不感歎那些編程高手,能夠將心思縝密,利用語言的各種特性去編程創造。對於建立單例模式還是比較推薦使用靜態內部類的方式建立,不失效能的同時又兼顧安全。但是其實我更加喜歡枚舉的方式。
Java 單例