• python中的四种单例模式


     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)
    第四种

     

  • 相关阅读:
    github上比较有名的一个前端面试题,随便做做(4)
    常见动态内存的管理程序错误
    .Net笔记(一)is和 as
    消息映射宏
    组态软件分析(第一节)
    指针形参与引用形参区别
    MFC 消息映射的产生
    WPF 路由事件(一)
    C# 封装集合
    Xaml Code Behind Generator (XAML 转成C#代码)
  • 原文地址:https://www.cnblogs.com/sxh-myblogs/p/8244813.html
Copyright © 2020-2023  润新知