1 # 单例模式:无法支持多线程情况 2 """ 3 class Singleton(object): 4 def __init__(self): 5 import time 6 time.sleep(1) 7 @classmethod 8 def instance(cls, *args, **kwargs): 9 if not hasattr(Singleton, "_instance"): 10 Singleton._instance = Singleton(*args, **kwargs) 11 return Singleton._instance 12 import threading 13 14 def task(arg): 15 obj = Singleton.instance() 16 print(obj) 17 18 for i in range(10): 19 t = threading.Thread(target=task,args=[i,]) 20 t.start()
1 import time 2 import threading 3 class Singleton(object): 4 _instance_lock = threading.Lock() 5 def __init__(self): 6 time.sleep(4) 7 @classmethod 8 def instance(cls, *args, **kwargs): 9 if not hasattr(Singleton, "_instance"): 10 with Singleton._instance_lock: 11 if not hasattr(Singleton, "_instance"): 12 Singleton._instance = Singleton(*args, **kwargs) 13 return Singleton._instance 14 def task(arg): 15 obj = Singleton.instance() 16 print(obj) 17 for i in range(10): 18 t = threading.Thread(target=task,args=[i,]) 19 t.start() 20 obj = Singleton.instance() 21 print(obj)
1 import time 2 import threading 3 class Singleton(object): 4 _instance_lock = threading.Lock() 5 def __init__(self): 6 pass 7 def __new__(cls, *args, **kwargs): 8 if not hasattr(Singleton, "_instance"): 9 with Singleton._instance_lock: 10 if not hasattr(Singleton, "_instance"): 11 Singleton._instance = object.__new__(cls, *args, **kwargs) 12 return Singleton._instance 13 obj1 = Singleton() 14 obj2 = Singleton() 15 print(obj1,obj2)
1 import threading 2 class SingletonType(type): 3 _instance_lock = threading.Lock() 4 def __call__(cls, *args, **kwargs): 5 if not hasattr(cls, "_instance"): 6 with SingletonType._instance_lock: 7 if not hasattr(cls, "_instance"): 8 cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) 9 return cls._instance 10 class Foo(metaclass=SingletonType): 11 def __init__(self,name): 12 self.name = name 13 obj1 = Foo(‘name‘) 14 obj2 = Foo(‘name‘) 15 print(obj1,obj2)