使用类简单实现
1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs): 6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs) 8 return Singleton._instance
缺点:多线程时会出错。例如:当两个线程启动时同时检测到Singleton没有_instance时,两个线程会同时创建两个实例。
改进:加锁
1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs): #加锁 lock() 6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs) #解锁 unlock() 8 return Singleton._instance
缺点:加锁 效率降低。且若已经有实例对象那么就不需要再加锁。
改进:双重判断。
class Singleton(object):
def __init__(self):
pass
def instance(cls, *args, **kwargs):
if not hasattr(Singleton, '_instance'):
lock()#加锁
if not hasattr(Singleton, '_instance'):
Singleton._instance = Singleton(*args, **kwargs)
unlock()#解锁
return Singleton._instance
缺点:该方法只能通过Singleton.instance()创建出单例对象。通过Singleton()创建出的对象不是单例对象。
改进:使用__new__方法
class Singleton(object):
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, '_instance'):
lock()#加锁
if not hasattr(Singleton, '_instance'):
Singleton._instance = object.__new__(cls)
unlock()#解锁
return Singleton._instance