單例在各類編程語言開發中都很常見,前面咱們使用Java OC swift 分別對單例進行了探討,下面咱們使用python寫一個線程安全的單例。python
import threading
def synchronized(func):
func.__lock__ = threading.Lock()
def lock_func(*args, **kwargs):
with func.__lock__:
return func(*args, **kwargs)
return lock_func
class Singleton(object):
instance = None
@synchronized
def __new__(cls, *args, **kwargs):
""" :type kwargs: object """
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
if __name__ == "__main__":
a = Singleton(3)
print("a單例! id爲 %s" % id(a))
b = Singleton(4)
print("b單例! id爲 %s" % id(b))
str = "hello world !"
c = Singleton(str)
print("c單例! id爲 %s" % id(c))
print("ok!")
複製代碼
在python3中,調用父類的方法是用super()來調用。 咱們這裏經過鎖來進行保護,保證多線程的狀況下同一時刻只有一個線程訪問,這就保證了單例模式的安全 將類傳入單例修飾器中,若是該類還未生成實例(instances中不存在該類),那麼就生成一個新的實例返回,並記錄在instances中。若是已經instances中已經存在該類,那麼直接返回實例cls.instance
編程
id是內置方法,咱們經過id來判斷對象是不是單例。運行結果以下swift