對於單例,最早可追溯到我上學那會兒的課程實習,那時候有企業裡的員工給我們進行軟體程式設計培訓,那會兒第一次聽說單例的概念。
在印象裡,
問:「你們知道如何只建立出乙個物件嗎?」
答:「不知道。為什麼只要建立乙個物件」。
問:「聽說過單例嗎?」
答:「沒有,單例是幹啥的?」
解釋:「單例就是保證程式執行期間,保證某乙個類永遠只有乙個物件,這樣既能節省空間,又能節省建立時間的開銷」。
我們:「他這是說的什麼意思?????他在說什麼??」。
其實,當我們接觸到spring之後,對於它的bean的建立,其實就是單例,就這樣糊里糊塗的開始接觸單例了。
單例的實現。
1.懶漢式單例。
這是平時寫的最多的了,懶漢式,就是很懶,當用到的時候才去執行new的操作,只要不使用,就不會占用空間。這可能能算是優點吧。/**
* 單例測試
*/public class singleton
private static singleton getsingleton()
return singleton; //3
}}
缺點:當然,如果你從事開發時間不長,不會去在意多執行緒的情況,如果考慮了多執行緒,我們先來看看多執行緒下會出現什麼問題。
執行緒a和執行緒b同時進來,步驟1時同時發現singleton為null,都去建立singleton物件,****了不是。
2.懶漢式單例---執行緒同步 。
基於懶漢式單例,如果出現上述情況咋辦,加鎖唄,synchronized解決問題。不過加上之後總覺得變扭。大多數時候又用不上。
/**
* 單例測試
*/public class singleton
public static synchronized singleton getsingleton()
return singleton;
}}
3.餓漢式單例
餓漢式效果也很明顯,首先singleton只在類載入的時候就進行了初始化,也就new物件,同時也避免了多執行緒的問題。/**
* 單例測試
*/public class singleton
public static singleton getsingleton()
}
缺點:非要說缺點的話,就是不管你用不用,它就在那兒了,如果這個單例物件占用空間很大的話,同時只在特定場景才出現,就有點得不償失了這樣。
3.靜態內部類
餓漢式的缺點也很明顯,那就是即使不使用,也會存在,那麼能不能在它使用時才讓它new呢?可以啊,靜態內部類不就可以解決嘛。
既達到了懶漢式的效果,又執行緒安全。/**
* 單例測試
*/public class singleton
//私有建構函式
private singleton()
public static singleton getsingleton()
}
4.列舉方式
第一次看見這種方式時真的,真的被驚呆了,還能這麼玩。。。既是乙個例項,又能保證執行緒安全。。。另外還有乙個就是序列化問題,如果單例實現了序列化介面,那麼就不能保證是唯一例項了,但是列舉保證了能被自由序列化,這個原因我這邊不想過多**,知道一下,後續研究。這也是最推薦的方式。/**
* 單例測試
*/public class singleton
}enum singletonenum
}
4.雙重檢查機制
volatile為什麼運用在這邊
/**
* 單例測試
*/public class singleton
private static singleton getsingleton()}}
return singleton;
}}
一般餓漢式比較普遍,列舉的方式太冷僻了,但是我覺得確實最好的,看過之後決定以後都這麼寫。
雙重檢查感覺太囉嗦,但是其他沒什麼,面試的時候雙重檢查也是可以深究問下去很多東西。比如static,比如volatile,比如類載入,比如synchronized。
Java設計模式一 單例模式
1 餓漢式 在呼叫之前會首先例項化.優點 寫法簡單,避免了執行緒同步問題。缺點 在呼叫之前就會例項化,沒有達到lazy loading的效果。如果自始至終都沒有使用過這個實力,就會造成記憶體浪費。注意 1 載入順序,先靜態再動態,先屬性再方法,先上後下。2 構造方法要是私有化的,3 屬性要用fina...
JAVA設計模式(一)單例模式
單例類只能有乙個例項。單例類必須自己建立自己的唯一例項。單例類必須給所有其他物件提供這一例項。private static singleton instance private singleton public static singleton getinstance return instance...
JAVA 設計模式(一)單例模式
懶漢模式 public class singlelh public singlelh getinstance 餓漢模式 public class singlelh public singlelh getinstance 懶漢模式可以延遲載入,但是執行緒不安全,得加鎖 餓漢模式執行緒安全,但是不能延遲...