普通的单例是不安全,必须要在单例对象里面,加入线程锁,才能达到线程安全
import threading
def synchronized(func):
func.__lock__ = threading.Lock()
def synced_func(*args, **kws):
with func.__lock__:
return func(*args, **kws)
return synced_func
def Singleton(cls):
instances = {}
@synchronized
def get_instance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return get_instance
def worker():
single_test = test()
print("id----> %s" % id(single_test))
@Singleton
class test():
a = 1
if __name__ == "__main__":
task_list = []
for one in range(5):
t = threading.Thread(target=worker)
task_list.append(t)
for one in task_list:
one.start()
for one in task_list:
one.join()
# 运行效果
id----> 2082136725432
id----> 2082136725432
id----> 2082136725432
id----> 2082136725432
id----> 2082136725432