zoukankan      html  css  js  c++  java
  • 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)
    第四种

     

  • 相关阅读:
    struts2校验器规范错误解决
    java extend 和 implements 的区别
    Java 中 synchronized的用法详解
    事件处理程序
    Web字体(链接)嵌入
    常见浏览器bug(针对IE6及更低版本)及其修复方法
    canvas实现的时钟效果
    SSM(springMVCspringmybatis)环境搭建01建立Mavenweb项目
    Android中关于软键盘的一些设置
    Android调用系统相机和相册
  • 原文地址:https://www.cnblogs.com/sxh-myblogs/p/8244813.html
Copyright © 2011-2022 走看看