Mongoose
在tornado.ioloop.IOLoop的方法中,
为什么在仔细检查后得到一个新实例?
如果我只检查一次,发生了什么问题?
@staticmethod
def instance():
"""Returns a global `IOLoop` instance.
Most applications have a single, global `IOLoop` running on the
main thread. Use this method to get this instance from
another thread. In most other cases, it is better to use `current()`
to get the current thread's `IOLoop`.
"""
if not hasattr(IOLoop, "_instance"):
with IOLoop._instance_lock:
if not hasattr(IOLoop, "_instance"):
# New instance after double check
IOLoop._instance = IOLoop()
return IOLoop._instance
答案 0 :(得分:1)
锁定正在保护对单身IOLoop
的操纵。但是从it seems that hasattr()
is usually atomic开始,我们可以安全地检查实例是否存在,而不是 required 来锁定互斥锁。这很好,因为锁定互斥锁可能很昂贵。最好先检查一下,如果绝对需要,只能解决锁定问题。
至于为什么有两张支票。想象线程A发现没有IOLoop
实例(即,第一次检查)。所以它试图锁定互斥锁。但在它可以这样做之前,线程B锁定互斥锁,创建单例,并释放互斥锁。现在线程A可以锁定互斥锁,但单例存在!它不应该再次创建,这就是为什么必须再次验证其(非)存在的原因。