1.內(nèi)部類實現(xiàn)
Class Singleton{
? ?private static class HelperHolder{
? ?public static final Helper helper=new Helper();
? ?}
? ? public static Helper newInstance(){
? ? ? ? return HelperHolder.helper;
? ? }
}
為什么說有趣呢,內(nèi)部類的實現(xiàn)能夠延遲初始化(Lazy initialization),并且多線程安全,還保證了高性能。
為什么會延遲初始化呢,因為java的語言特性,內(nèi)部類只有在使用的時候才會去加載,從而初始化內(nèi)部靜態(tài)變量。
為什么沒有加線程鎖會是線程安全的呢,Java運行環(huán)境自動給你保證的,加載的時候會自動隱形同步。
為什么是高性能呢,在訪問對象時,不需要同步java虛擬機,又會自動給你取消息同步,所以效率高。
2.枚舉實現(xiàn)
public enum Singleton{
? ? ? ? INSTANCE;
? ? ? ? private Singleton(){
? ? ? ? }
? ? public Helper newInstance(){
? ? ? return new Helper();
? ? ? }
}
枚舉的實現(xiàn) 即使使用反射機制也無法多次實例化一個枚舉量,也是線程安全的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 源自《JAVA編程思想》