設計模式之單例模式

2021-07-25 22:04:58 字數 2577 閱讀 5475

即保證整個系統只有乙個例項物件

2).工具方法

通過對建構函式私有化類實現物件單例

singleton

public class singleton 

public static singleton getinstance()

return _instance;

} public static void dosomething()

}

client

public class client

}

上面這種方式存在問題,當有多執行緒時,會導致例項被建立多次。於是我們引入同步鎖:

singleton

public class singleton

public static singleton getinstance()

return _instance;

} }

public static void dosomething()

}

client:

public class client

});t.start();

} }}

如上,加入同步關鍵字後會引發效率問題,我們可以加入雙檢鎖,縮小鎖的範圍

singleton

public class singleton 

/*** new singleton() 這句話其實是包含三個邏輯 1.給singleton例項建立空間 2.初始化singleton的構造器

* 3.把singleton這個例項的引用賦值給_instance (_instance就不為null了)

* 由於jvm執行期的優化,第二部和第三步的順序是不能保證的 這樣就會導致出現兩種情況1,2,3或1,3,2

*/public static singleton getinstance()

}} return _instance;

} public static void dosomething()

}

client

public class client

});t.start();

} }}

如上這種實現方式中 new  singleton()包含三個邏輯:

1.給singleton例項建立空間

2.初始化singleton的構造器

3.把singleton這個例項的引用賦值給_instance (_instance就不為null了)

假如第乙個執行緒呼叫獲取例項的方法時,執行到new singleton();這句話,只執行了1,3兩個步驟,

這個時候_instance已經不為null了,但是構造器沒有初始化完成,然後第二個執行緒進來,由於此時

_instance已經不為null了,所以在判讀非空的時候就直接返回了,這時如果執行緒2使用這個構造器沒

有初始化完成的singleton物件的話,就會報錯!

解決方案有:

1.jdk1.5及1.5以後版本可以在變數中宣告volatile關鍵字,讓執行緒強制讀取主內容中的變數,而不去讀取變數副本。

2.通過餓漢式的單例模式來解決

3.使用靜態類來儲存instance

singleton

public class singleton 

public static singleton getinstance()

}} return _instance;

} public static void dosomething()

}

public class singleton

public static singleton getinstance()

public static void dosomething()

}

client

public class client 

}

singleton

public class singleton

private singleton()

public static singleton getinstance()

public static void dosomething()

}

client

public class client 

}

小結:在軟體設計當中,我們應該遵循乙個法則,簡單,正確。不為了炫耀技術來實現需求,只有簡單,正確的實現方式,它生命週期才是最長,因它可維護性高。所以選擇懶漢還是飢漢的方式是根據具體的場景定的。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...