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

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

 

 

#coding=utf-8import threading, time#整个try的这一段其实就是定义了一个装饰器 make_synchronizedtry:    from synchronize import make_synchronizedexcept ImportError:    def make_synchronized(func):        func.__lock__ = threading.Lock()        def synced_func(*args, **kws):            #with 会自动给threading.Lock 获取锁和释放锁(资源)            with func.__lock__:                return func(*args, **kws)  #锁定期间, 其他线程获取不到资源        return synced_funcclass Singleton(object):    instance = None    @make_synchronized    def __new__(cls, *args, **kwargs):        #__new___ 本身用来初始化实例, 如果check 到内存中有初始化的实例则直接返回内存地址        #如果check到没有实例化的实例则调用父类的__new__重新进行初始化实例, 之所以说调用父类的__new__        #是因为我们实际上是重载了object的__new__        #__new__的返回就是__init__中的self值        if cls.instance is None:            cls.instance = object.__new__(cls, *args, **kwargs)            #cls.instance = super(Singleton, cls).__new__(cls, *args, **kwargs) 这两段代码同等作用        return cls.instance    def __init__(self):        #time.sleep(1)        self.blog = "brownz"    def go(self):        #定义全局变量, 所有线程均可调用        global num        for i in xrange(1000000):            num += 1        print "go num is:", num, time.time()def worker():    e = Singleton()    print e.blog    print id(e)    e.go()def test():    e1 = Singleton()    e2 = Singleton()    e1.blog = 123    print e1.blog    print e2.blog    print id(e1)    print id(e2)if __name__ == "__main__":    test()    task = []    num = 0    for i in range(3):        t = threading.Thread(target=worker())        task.append(t)        t.start()    for threadlist in task:        threadlist.join()

[out]:

:\Project-workspace\python_test\Thread>python singleton.py

123
123
40365264
40365264
brownz
40365264
go num is: 1000000 1536060468.22
brownz
40365264
go num is: 2000000 1536060468.3
brownz
40365264
go num is: 3000000 1536060468.38

 

windows下面看不出上不上锁的区别, 自行理解多线程的上锁机制吧

转载于:https://www.cnblogs.com/brownz/p/9588030.html

你可能感兴趣的文章
Robberies
查看>>
get post 提交
查看>>
R安装
查看>>
跟我一起学C++
查看>>
Android自动化测试之环境搭建
查看>>
JavaScript运算符
查看>>
html position布局
查看>>
VTP
查看>>
Linux内核分析第一周——计算机是如何工作的
查看>>
Windows 自动启动 bat
查看>>
不规则按钮,支持普通Button,Radio Button, Check Button
查看>>
【C语言】模拟实现库函数strcat函数
查看>>
用newLISP读取Hive的元数据
查看>>
模式识别 - libsvm该函数的调用方法 详细说明
查看>>
数据库启动(下一个)
查看>>
FineUI第九天---表单验证
查看>>
Unity3D 快捷键
查看>>
Springboot集成WebSocket通信全部代码,即扣即用。
查看>>
接口,lambda表达式与内部类
查看>>
【poj1009】 Edge Detection
查看>>