import threading
import time
class SingleTon(object):
instance = None
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
time.sleep(0.1)
cls.instance = object.__new__(cls)
return cls.instance
def task():
obj = SingleTon('Arno')
print(obj)
for i in range(10):
t = threading.Thread(target=task)
t.start()
上述代码为单例模式和多进程的一个复合应用
但是 在执行时会出现异常情况
<__main__.SingleTon object at 0x0000018E3CEE13A0><__main__.SingleTon object at 0x0000018E3CEE1BE0>
<__main__.SingleTon object at 0x0000018E3D168490>
<__main__.SingleTon object at 0x0000018E3D168BE0><__main__.SingleTon object at 0x0000018E3D168490><__main__.SingleTon object at 0x0000018E3D168AF0>
<__main__.SingleTon object at 0x0000018E3D168970><__main__.SingleTon object at 0x0000018E3CEE1BE0>
<__main__.SingleTon object at 0x0000018E3D1689A0>
<__main__.SingleTon object at 0x0000018E3CEE13A0>
我们没有得到想要的相同的内存地址的实例
因为 在10个线程同时走到time.sleep()时 会同时卡住 然后同时执行
所以 我们加上一个锁就可以了
import threading
import time
class SingleTon(object):
instance = None
lock = threading.RLock()
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
with cls.lock:
if cls.instance:
return cls.instance
time.sleep(0.1)
cls.instance = object.__new__(cls)
return cls.instance
def task():
obj = SingleTon('Arno')
print(obj)
for i in range(10):
t = threading.Thread(target=task)
t.start()
此时运行的结果为
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
<__main__.SingleTon object at 0x000001548D0E03A0>
均为同一内存地址



