我所知道的單利有三種:
以下是單例模式的特點:
1. 單例類只能有乙個例項。
2. 單例類必須自己自己建立自己的唯一例項。
3. 單例類必須給所有其他物件提供這一例項。
1.餓漢式
餓漢式是典型的空間換時間,當類裝載的時候就會建立類的例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷,節省了執行時間,使用起來綠色環保,因為簡單易懂,當實現了serializable介面後,反序列化時單例會被破壞,實現了serializable介面需要重寫readresolve,
才能保證其反序列化的時候依舊是單例
//餓漢式單例類.在類初始化時,已經自行例項化
public class singleton
private static final singleton single = new singleton();
//靜態工廠方法
public static singleton getinstance()
} private object readresolve() throws objectstreamexception
2.懶漢式
懶漢麼,所以在多執行緒下會失效,所以下面介紹三種懶漢的公升級版來適應多執行緒
2.1在getinstance前加上synchronized(同步),但這導致的是每次getinstance都會去同步,消耗資源。
public class singleton
private static singleton single = null;
// 靜態工廠方法
public static synchronized singleton getinstance()
return single;
} }
2.2雙重檢查鎖,它是在以上做的修改,判斷兩次空,所以只有在第一次呼叫的時候會同步,避免了每次同步資源的消耗,注意 volatile 關鍵字。
public class singleton
private volatile static singleton singleton = null; // 宣告成 volatile
//靜態工廠方法
public static singleton getinstance()
} }
return singleton;
} }
2.3內部靜態類,這種我覺得是最好的,既實現了執行緒安全,也避免了同步帶來的效能影響。
public class singleton
private singleton()
public static singleton getinstance()
} 3.列舉
public enum something
public resource getinstance()
} 以上就是常用的單例模式,一般的情況下,我會使用餓漢式,只有在要明確實現lazy loading(不是翻譯成懶,差不多算延遲、推遲的意思。 是說不在初始化時loading,而是推遲到必須loading時才進行loading。)效果時才會使用內部靜態類,另外,如果涉及到反序列化建立物件時我會試著使用列舉的方式來實現單例,不過,我一直會保證我的程式是執行緒安全的。
你真的了解Java嗎?
三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...
你真的了解restful api嗎?
在以前,乙個 的完成總是 all in one 頁面,資料,渲染全部在服務端完成,這樣做的最大的弊端是後期維護,擴充套件極其痛苦,開發人員必須同時具備前後端知識。於是慢慢的後來興起了前後端分離的思想 後端負責資料編造,而前端則負責資料渲染,前端靜態頁面呼叫指定api獲取到有固定格式的資料,再將資料展...
你真的了解git嗎?
看了幾遍廖雪峰的git教程和阮一峰的git教程之後,覺得自己使用git已經是得心應手了,腦中也構建出了一副關於git操作的影象。學習乙個新東西的時候我總是喜歡把知識形象化出乙個圖譜在腦中,這樣記憶的更加深刻。但是隨著使用的深入,我發現我腦中的影象與git的實際行為存在出入。稍微進入一下正題。假如你的...