設計模式有很多種,單例模式只是其中一種,很多面試官都會考,但是怎麼寫出高水平的單例模式呢?今天給大家分享下。
首先單例模式保證類的物件在記憶體中全域性唯一性,主要是為了減少物件對資源的占用。
那麼要怎麼實現呢?問題有2個,一是類的外部不允許直接構建此類物件,二是類的外部只能通過靜態方法訪問此物件。解決方法:首先是構造方法私有化,在類的內部構建物件,通過定義乙個靜態方法,通過這個方法直接返回此物件。
class singleton01
private static singleton01 instance;
public static singleton01 getinstance()
return instance;
}}可能會建立多個物件,那麼該怎麼辦呢?
可以使用synchronized關鍵字,保證在某個時間只有乙個執行緒能訪問getinstance()
方法。class singleton02
private static singleton02 instance;
public static synchronized singleton02 getinstance()
return instance;
}}這個雖然解決了執行緒安全問題,但是如果多個執行緒訪問getinstance()方法,
只有乙個執行緒執行,其他執行緒全部阻塞,會極大的影響效能。
熟悉synchronized的小夥伴都知道,synchronized方法不僅可用於修飾方法,
還可作用於靜態方法和**塊。
class singleton03
private static volatile singleton03 instance;
public static singleton03 getinstance()}}
return instance;
}}這一行** instance=new singleton03();其實是3個步驟,
首先為instance分配記憶體空間,然後初始化instance,最後將instance指向分配的
記憶體空間,但是在jvm中會為了提高效率進行指令重排序。因此可能會得到乙個沒有
例項化的instance物件,使用volatile宣告物件,防止指令重排序。
但是不適合頻繁訪問。
class singleton04
//類載入時建立物件
private static final singleton04 instance=new singleton04();
//沒有阻塞問題適合頻繁訪問
public static singleton04 getinstance()
}這個單例設計適合頻繁訪問,如果物件比較大,在類載入的時候就建立了此物件,
但是假如不適用,就可能長時間占用。我們可以使用延遲載入策略。
class singleton05
static class lazy
public static singleton05 getinstance()
}
單例模式你學會了嗎? 設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...