博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 单例模式
阅读量:5162 次
发布时间:2019-06-13

本文共 1983 字,大约阅读时间需要 6 分钟。

#  记录两种常用的单例模式 #  第一种
import threading import time class Singleton(object):     _instance = None     def __init__(self):         time.sleep(3)     @classmethod     def instance(cls, *args, **kwargs):         if not cls._instance:             cls._instance = cls(*args, **kwargs)         return cls._instance #  在多线程时会有问题 s1 = Singleton.instance() s2 = Singleton.instance() print(s1) print(s2)
#  在多线程时,如果在__init__方法中存在IO操作,导致在对象创建过程中出现线程切换,单例模式就会失败。例如,在__init__中加入sleep,再使用多线程创建对象。
def create():     s = Singleton.instance()     print(s) for i in range(10):     t = threading.Thread(target=create)     t.start()

#    输出结果如下:

<__main__.Singleton object at 0x0000022C12E65208> <__main__.Singleton object at 0x0000022C12E65048> <__main__.Singleton object at 0x0000022C12E653C8><__main__.Singleton object at 0x0000022C12E653C8><__main__.Singleton object at 0x0000022C12E653C8><__main__.Singleton object at 0x0000022C12E653C8><__main__.Singleton object at 0x0000022C12E653C8><__main__.Singleton object at 0x0000022C12E5AE48><__main__.Singleton object at 0x0000022C12E5AE48> <__main__.Singleton object at 0x0000022C12E5A978>

#    解决办法加锁:

class Singleton(object):    _instance = None    _instance_lock = threading.Lock()    def __init__(self):        time.sleep(3)    @classmethod    def instance(cls, *args, **kwargs):        cls._instance_lock.acquire()        if not cls._instance:            cls._instance = cls(*args, **kwargs)        cls._instance_lock.release()        return cls._instance

#    第二种:

#    在创建对象时,先执行__new__方法,因此在__new__方法中实现单例模式,这种方法的好处在于创建对象时和普通创建对象相同

class Singleton(object):     _instance = None     def __init__(self):         time.sleep(2)     def __new__(cls, *args, **kwargs):         if not cls._instance:             cls._instance = object.__new__(cls, *args, **kwargs)         return cls._instance
s1 = Singleton() s2 = Singleton() print(s1) print(s2)

#    本来以为在使用多线程测试时,会出现和第一种方法相同的问题,但是,测试来看没有发现这个问题,所以也就没有加锁了。

 

 

 

 

 
 

转载于:https://www.cnblogs.com/shouwangrenjian/p/10876647.html

你可能感兴趣的文章
hdu 4960 数列合并
查看>>
IP通信基础 4月17日
查看>>
python学习之字符串常用方法
查看>>
jquery1.7.2的源码分析(二)
查看>>
JavaScript自学代码--(三)
查看>>
[NOIP2000]单词接龙
查看>>
设计模式之外观模式
查看>>
Nginx反向代理的基本配置
查看>>
SpringMvc文件资源防止被外链链接
查看>>
WCF、WebAPI、WCFREST、WebService之间的区别
查看>>
设计模式 -- 单例模式
查看>>
Linux下安装 php imagick扩展
查看>>
git出现: not a git repository
查看>>
appium 问题
查看>>
go条件语句
查看>>
css使用的三种方式
查看>>
C#中Const和Readonly的区别
查看>>
Noip2016day2 组合数问题problem
查看>>
django中widget小部件
查看>>
训练记录
查看>>