实现单例模式的5中方法

你离开我真会死。 提交于 2019-12-01 08:11:46

使用类简单实现

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    

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!