單例模式的五種實現方式

2021-05-23 18:52:38 字數 1590 閱讀 5979

1.最容易想到的方式

public class singleton

public static singleton getinstance() 

public static void main(string args)

}優點是:簡單

缺點是:無論用沒用到instsnce,都會進行初始化。

2.延遲載入(lazy-load)

public class singleton2

private static singleton2 instance ;

public synchronized static singleton2 getinstance()

return instance;

}public static void main(string args)

}優點:做到了延遲載入,也可以說是按需載入

缺點:方法同步,效率低

3.double-check-lock

public class singleton3

private volatile static singleton3 instance;//volatile,保證可見性。各個執行緒的工作儲存器和主存保持一致

public static singleton3 getinstance()}}

return instance;

}public static void main(string args)

}注意這裡的「volatile」關鍵字,我們知道jdk1.4以前,dcl是無法保證正常工作的,但是從jdk5開始,把instance定義成volatile就可以保證正常工作了。

為什麼1.4以前,dcl不能正常工作,這主要跟jvm的記憶體模型有關。這就說來話長了,jvm把記憶體分為兩類,主儲存器和工作儲存器,主儲存器只有乙份,但是,每乙個執行緒都有自己的工作儲存器,執行緒不能直接操縱主儲存器,都是把主存裡面的值拷貝到自己的工作儲存器,然後操作自己的工作儲存器,然後在適當的時候,寫回到主儲存器裡面。volatile就保證了所有的執行緒的工作儲存器和主儲存器是一致的。

優點:延遲載入

缺點:只需要一次同步

4. initialization on demand holder idiom

public class singleton4

private singleton4()

public static singleton4 getinstance()

public static void main(string args)

}類載入到jvm的時候,會進行初始化,但是只會初始化static成員和static**塊,而不會初始化靜態內部類的成員。因此,只有實際呼叫getinstance的時候,才會初始化靜態內部類的靜態成員。做到了延遲載入。同時,jvm的類載入機制保證了絕對不會出現同步問題,避免了雙檢查鎖。

優點:延遲載入,而且不需要同步。

5.enum

enum singletonenum   

};  

protected abstract void somemethod();  

}  public class singleton5

}還有比這個更簡潔明瞭的嗎?

單例模式的五種實現方式

單例模式 無論在什麼時候,該類只有乙個例項。實現單例模式的要點就是提供乙個私有的無參建構函式。一 餓漢單例模式public class singleobject public static singleobject getinstance 二 懶漢單例模式 懶漢的意思就是慢悠悠的,不著急,也就是在呼...

Python 單例模式實現的五種方式

全域性變數 ip 192.168.13.98 port 3306 class mysql instance none def init self,ip,port self.ip ip self.port port classmethod def instance cls,args,kwargs if...

python單例模式的五種實現方式

1.new 特殊方法實現 class singleton def new cls,args,kwargs if nothasattr cls,instance cls.instance super singleton,cls new cls return cls.instance def init ...