以前使用的單態模式,也能實現,不過有個限制,看下面的代碼
import java.util.*;這就是我們常使用的單態模式。
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton getInstance()
{
if (instance == null) //1
instance = new Singleton(); //2
return instance; //3
}
}
現在,我們作一個假設,如果兩個線程同時執行此程序,都剛執行完1,到2,還沒有之行,停住。
此時
thread1得到的instance是null
thread2得到的instance也是null
下面會如何呢?
顯然,兩個線程會分別創建和初始化一個new Singleton()對象。
那么,我們的單態還能實現單態的功能嗎?不能。
不過,這是個特例,只有在多線程程序,同時兩個或多個線程都執行到1還沒有執行2的時候才能出現。也就是說,如果沒有實現方法的同步的話,上面的模式是不能保證生成一個實例的。
如果是在非多線程的程序中就更不會出現這樣的問題。
但是,些程序是一個嚴密的工作。所以,程序要在任何情況和平臺下都是正確的。
希望,通過此文,你也能明白,為什么上面的單態模式是不安全的,為什么這種實現方法有生成多個實例的可能?
想更深入的理解,請參考
http://guanhw.blog.hexun.com/10653016_d.html
|----------------------------------------------------------------------------------------|
版權聲明 版權所有 @zhyiwww
引用請注明來源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|