# 常见面试版本
1 import threading
2 import time
3
4
5 class Singleton(object):
6 _instance = None
7 lock = threading.RLock()
8
9 def __init__(self, name):
10 self.name = name
11
12 # 不加锁出现问题版本
13 # def __new__(cls, *args, **kwargs):
14 # if not cls._instance:
15 # time.sleep(0.2) # 这里会引发问题,每一个执行之后没有立刻改cls._instance,
16 # # 先一个进来发现还是为空,立即设置自己的__instance,于是极大可能单例出现问题
17 # cls._instance = object.__new__(cls)
18
19 # 加锁解决问题版本
20 def __new__(cls, *args, **kwargs):
21 with cls.lock: # 下面可能存在问题的解决方法,必须使用,计时加上时间的延迟也没有影响
22 if not cls._instance:
23 time.sleep(0.2) # 加锁之后会等待,不再影响
24 cls._instance = object.__new__(cls)
25
26 return cls._instance
# 主流源码采用方法
# 为什么使用单例模式,为了在一个程序执行的生命周期里面不在重复的生成相同的资源,这回带来额外的不必要的消耗,比如配置文件没有相同的资源没必要重复加载
# 现有settings.py 文件,a.py,b.py文件,a.py会调用b.py文件的实例,a.py文件制执行部分会加载settings配置文件,b.py同样会加载,两者都导入setting文件,但是两者的导入的settings只会加载一次,也就是先加载的settings.py
# 未完,之后补充源码