Python实现单例模式,并且启动100个线程进行测试
import threading
import time
class Singleton(object):
__lock = threading.Lock()
__instance = None # 单例对象,必须是类属性
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
# 如果实例存在直接返回
if Singleton.__instance:
return Singleton.__instance
# 如果实例不存在,申请锁,只有获得了锁,才能创建实例
if Singleton.__lock.acquire():
if Singleton.__instance == None: # 只有对象没有年被创建,才创建
Singleton.__instance = object.__new__(cls)
pass
Singleton.__lock.release() # 释放锁
pass
return Singleton.__instance # 返回实例
pass
pass
# 测试用线程
class TestThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.__name = name
pass
def run(self):
s = None
while True:
# time.sleep(1)
s = Singleton() # 创建实例
print(s)
pass
pass
if __name__ == "__main__":
# 100个线程 无限创建实例
for i in range(100):
t = TestThread('thread-' + str(i))
t.start()
pass
pass
测试结果,所有线程得到的都是同一个实例
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-70 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-40 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-15 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-5 : <main.Singleton object at 0x000001960A7E24A8>
thread-87 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-69 : <main.Singleton object at 0x000001960A7E24A8>
thread-62 : <main.Singleton object at 0x000001960A7E24A8>
thread-87 : <main.Singleton object at 0x000001960A7E24A8>
thread-75 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-7 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-44 : <main.Singleton object at 0x000001960A7E24A8>
thread-0 : <main.Singleton object at 0x000001960A7E24A8>
thread-33 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-70 : <main.Singleton object at 0x000001960A7E24A8>
thread-51 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-99 : <main.Singleton object at 0x000001960A7E24A8>
thread-37 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-14 : <main.Singleton object at 0x000001960A7E24A8>
thread-37 : <main.Singleton object at 0x000001960A7E24A8>
thread-79 : <main.Singleton object at 0x000001960A7E24A8>
thread-28 : <main.Singleton object at 0x000001960A7E24A8>
thread-69 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-28 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-38 : <main.Singleton object at 0x000001960A7E24A8>
thread-74 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-46 : <main.Singleton object at 0x000001960A7E24A8>
thread-74 : <main.Singleton object at 0x000001960A7E24A8>
thread-30 : <main.Singleton object at 0x000001960A7E24A8>
thread-97 : <main.Singleton object at 0x000001960A7E24A8>
thread-7 : <main.Singleton object at 0x000001960A7E24A8>
thread-36 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-82 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-26 : <main.Singleton object at 0x000001960A7E24A8>
thread-13 : <main.Singleton object at 0x000001960A7E24A8>
thread-44 : <main.Singleton object at 0x000001960A7E24A8>
thread-83 : <main.Singleton object at 0x000001960A7E24A8>
thread-13 : <main.Singleton object at 0x000001960A7E24A8>
thread-93 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>