先看了個常見的單例模式,剛接觸設計模式買了本大話設計模式,講到單例模式時關於多線程,用了雙重檢查鎖DCL,不過在獸王的博客裏對其否定了,來看看獸王是怎麼講解的吧。
[url=http://rjx2008.iteye.com/blog/342474#comments]不容易掌握的單例模式[/url]
小知識:單例模式有兩種,飽漢、餓漢。顧名思義餓漢是飢不擇食,強行創建,而飽漢則會挑挑食。
//餓漢式
Class A{
private static A a=new A();
private A(){}
public A getA(){
return a;
}
}
//飽漢式
class B{
private static B b;
private B(){}
public B getB(){
if(b!=null){
return b;
}else{
b=new B();
retrun b;
}
}
}
獸王對多線程情況下單例迷失應用的處理是:
public class Singleton {
private Singleton(){
}
//靜態內部類
static class SingletonInner{
static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonInner.instance;
}
}
原因:使用靜態內部類!它是由一個叫Bob Lee的人寫下來的(最初忘記了是哪兩個人提出)。在加載singleton時並不加載它的內部類SingletonInner,而在調用 getInstance()時調用SingletonInner時才加載SingletonInner,從而調用singleton的構造函數,實例化 singleton,從而在不需要同步的情況下,達到延遲初始化的效果。
文中的內容均是獸王Rjx2008的出品,[url=http://rjx2008.iteye.com/blog/340083]鏈接[/url]