您好,登錄后才能下訂單哦!
設計模式是優(yōu)秀程序員的必備技能,在面試中也會經(jīng)常提到。
IT行業(yè)是跳槽率較高的行業(yè),這就不頻繁的去面試。我作為面試官,如果候選者其他知識都OK的話,最后就會提到<b>設計模式</b>相關的內(nèi)容。如果回答的一知半解的話,我會跟他說讓他來做項目。如果回答的比較好的話,會直接安排到產(chǎn)品組。
保證了系統(tǒng)內(nèi)存中該類只有一個對象實例,節(jié)省系統(tǒng)資源。對于需要頻繁創(chuàng)建銷毀的對象,提高系統(tǒng)性能
需要頻繁創(chuàng)建、銷毀的對象,創(chuàng)建對象耗時過多或耗費資源過多,但又經(jīng)常用到的對象。
單例模式是設計模式中比較簡單的一種。絕大多數(shù)程序員對單例模式都比較熟悉(我剛開始學的時候,好多次都沒堅持把23種設計模式學完,造成的后果就是單例模式反反復復學了好多遍【狗頭】)。
單例模式在業(yè)界分為8種。這么多種其實不用全都學習,主要關注下線程安全的3種即可。(其他的就不要再學習,人為的增加難度了)。
雙重檢查
public class Singleton {
// 私有化構(gòu)造器,方式直接通過new的方式創(chuàng)建
private Singleton() {}
// 提供全局的實例對象,接收創(chuàng)建值(懶加載)
private static volatile Singleton instance;
// 提供獲取實例的方法
public static Singleton getInstance() {
//重點1:通過 instance == null 判斷當前 instance是否為null,如果不等于null,直接返回值
if (instance == null) {
//重點2:通過synchronized關鍵字控制線程安全
synchronized (Singleton.class) {
//重點3:synchronized內(nèi)只有一個線程在執(zhí)行,這時候根據(jù)對象是否為null,判斷是否創(chuàng)建。
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public void method(){}
}
問題1:為什么 instance 要判斷2次是否 == null ?
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
//1.synchronized內(nèi)部的instance == null是防止重復創(chuàng)建實例的。比如有兩個線程A,B. A在進入到synchronized的時候,B可能也在synchronized外等待了。A線程創(chuàng)建instance成功后,B再進入線程,此時可根據(jù)synchronized內(nèi)部的instantce == null來控制B直接使用,防止重新創(chuàng)建。
//2.synchronized外部的instance == null 是控制效率的。如果此時已經(jīng)存在instance對象時,再來一個線程C,此時無需執(zhí)行synchronized部分代碼,直接返回。提高了執(zhí)行效率。(都知道synchronized比較慢【狗頭】)
問題2:volatile是干嗎的?
volatile這個關鍵字是個很大的話題,涉及到內(nèi)存模型。
簡單來講:volatile讓變量每次在使用的時候,都從主存中取。而不是從各個線程的“工作內(nèi)存”。
靜態(tài)內(nèi)部類
利用靜態(tài)內(nèi)部類的加載機制來實現(xiàn)的單例
public class Singleton {
private Singleton() {}
//1.靜態(tài)內(nèi)部類機制:在Singleton加載的時候,SingletonInstance類不會立即被加載。實現(xiàn)了懶加載的功能
//2.在調(diào)用SingletonInstance.INSTANCE會立即加載,且是線程安全的。
public static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
// 提供獲取實例的方法
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
public void method(){}
}
枚舉
推薦使用,利用枚舉的機制實現(xiàn)單例。不僅能避免多線程同步問題,還能防止反序列化重新創(chuàng)建新的對象。
public enum Singleton {
INSTANCE;
public void method(){}
}
問題1:public void method(){} 是干嗎的?
我在開始學習時也遇到這個問題,懂的自然懂,不懂的很困惑。網(wǎng)上搜資料也都寫的一模一樣。
答案很簡單,一句話。使用單例模式,是為了創(chuàng)建唯一的實例。那么創(chuàng)建了這個實例之后,用它干嗎呢?對,自然是要調(diào)用它所在的類的方法。public void method(){}就是你要調(diào)用的方法。
其他的教程中雙重檢查 和 靜態(tài)內(nèi)部類 只寫了獲取實例,沒有寫public void method(){} ,所以才造成困惑。細心的童鞋可能注意到了,我這三個單例模式都寫了public void method(){}。趕快為了我的細心點個贊吧。
最后溫馨提醒下,枚舉最簡單,也是推薦方法,趕快多練習幾遍,面試時秒殺面試官吧!
java.lang.Runtime
public class Runtime {
private static Runtime currentRuntime = new Runtime();
/**
* Returns the runtime object associated with the current Java application.
* Most of the methods of class <code>Runtime</code> are instance
* methods and must be invoked with respect to the current runtime object.
*
* @return the <code>Runtime</code> object associated with the current
* Java application.
*/
public static Runtime getRuntime() {
return currentRuntime;
}
/** Don't let anyone else instantiate this class */
private Runtime() {}
}
數(shù)據(jù)源、session工廠等
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。