單例模式就是嚴格控制乙個類的例項,要求在乙個程序或乙個執行緒中只存在乙個例項,如果沒有就建立乙個例項返回,如果有就返回已經已經存在的例項。不同的單例模式都是為了確保只有乙個例項。
暫時想不到
單例類在乙個程序或執行緒中只能存在乙個例項。
單例類的構造器必須私有化。不允許其它類來建立單例類,只有它自己能夠建立自己。
單例類需要向其它類提供獲取例項的方法,一般是靜態的。
減少了記憶體的開銷。因為單例模式要做是嚴格控制只能存在乙個例項,這樣就會極大地減少例項反覆建立時帶來的記憶體開銷。
更加容易管理和維護。沒什麼好說的,全部內容都寫在這個類裡,只需要修改這個類就行了。
擴充套件性不強。單例模式只專注於只有能存在乙個例項,這就犧牲了它的擴充套件性。
與單一職責衝突。因為所有方法都要封裝在單例類中,所以會越來越龐大,職責也會越來越不清晰。
就像餓漢遇到美食一樣,一下子就全部吃完。
餓漢式單例,就是在裝載.class檔案是就會在靜態區生成乙個例項,其它類都是呼叫這個類。
package singletion;
/** * @author xxj
* 餓漢單例
*/public
class
hungrysingletion
public
static hungrysingletion getinstance()
}
餓漢式就是簡單粗暴,一上來就在靜態區生成乙個例項,保證了執行緒安全,不會產生多餘的例項,但是建立的例項會導致初始化比較緩慢。下一種單例模式就是解決了這個問題。
懶漢嘛就是懶,不到火燒眉毛的時候絕對不會去做事情。
懶漢式單例,就是只在呼叫向其它類提供獲取例項的方法時,才會去生成例項,但是這樣就會存在一些執行緒問題。
**
package singletion;
/** * @author xxj
* 懶漢式單例
*/public
class
lazysingleton
public
static lazysingleton getinstance()
}
特點**package singletion;
/** * @author xxj
* 雙重檢查懶漢式單例
*/public
class
doublechecklazysingleton}}
return instance;
}private
doublechecklazysingleton()
}
雙重檢查
簡單點說,第一次檢查是為了提高效率,畢竟並不是所有執行緒都能轉這個空子,這一道檢查,就可以攔截大部分的執行緒了;第二次檢查才是真正地解決執行緒安全問題,這裡加上了synchronized關鍵字,通過加鎖的方式,就可以解決多執行緒問題了。
特點繼承了簡單-懶漢式單例的延遲載入的特點,也解決了執行緒安全問題,唯一的缺點就是結構複雜了。
還有一種懶漢式單例模式,就是比雙重檢查-懶漢式單例少第二次檢查,那種單例能解決少量執行緒的執行緒安全問題,執行緒數多了,就不能保證了。
下面是兩種不常用的單例模式。
public
class
singleton
private singleton (
)public
static
final singleton getinstance()
}
這種使用靜態內部類實現的單例模式,其實是餓漢式的公升級版,首先是在單例類的內部建立了乙個靜態內部類,內部類裡面有乙個單例類的例項;然後,單例類給其它類提供乙個獲取例項的方法。
當其它類呼叫這個方法時,類載入器才會去裝載內部類,一裝載,就會生成乙個單例類的例項。
不僅繼承了餓漢式的執行緒安全的特性,而且實現了延遲載入的功能。
package singletion;
/** * @author xxj
* 列舉類單例模式
*/public
enum enumsingleton
}
首先即使實現簡單方便,用列舉類實現單例實際上和餓漢式是一樣的,它可以保證執行緒安全,但是同樣初始化比較緩慢。
再說一點,列舉類的確可以實現單例化,我驗證過hashcode,都是一樣的,但是它的寫法就有點讓人摸不著頭腦。
一般情況下,使用餓漢式和列舉類實現就可以了,如果要考慮延遲載入的話,就使用簡單-懶漢式,再要考慮執行緒安全問題,就加個雙重檢查,或者直接使用靜態內部類實現。
人類的終極目標是什麼?
終極目標,就是該目標是最重要的,且不從屬與其他目標,它是頂級目標 相反,其他目標都最終是為實現終極目標服務的。人類的終極目標是生存,人類至今為止所有的活動大體上都是為了生存這個目標在服務。生存包含了 個體存在與物種延續 終極目標的副產品是自我實現,自我價值體現,受尊重 擁有成就 名氣 社會地位 社交...
谷歌的終極目標「人工智慧」
服務還沒有為谷歌創造太多營收,但它們絕對不是錦上添花的業務。卡爾認為,這些網路應用代表著根本性的變革,意味著從桌面到網路的巨大轉變,未來將重新定義計算和谷歌的業務模式。為了讓人們更容易理解這場變革,卡爾特別舉了乙個類似的例子 電力的發展。他認為,真正的電力創新並不是湯姆斯 愛迪生 thomas ed...
程式設計師的終極目標就是乾掉程式設計師
做了4年的碼農了,每天對著電腦就是寫 沒事也會思考下,算是悟 道 吧。物件導向 都是為了一句話 重複的 不要寫第二次。我基本上不會copy and paste,因為每次操作都有一種負罪感,感覺 沒寫好,對不起自己的水平,雖然我水平一般,但總以為自己比一般人強,也算是一種激勵吧。自尊產生的驅動力總能自...