双重检查锁定模式在某些语言中不可靠,我想知道Python是否属于这类语言。更具体地说,以下代码是否可行...
# Objects shared by threads:
obj = None
lock_for_obj = threading.Lock()
def get_obj():
"""Function called concurrently by threads."""
if obj is None:
with lock_for_obj:
if obj is None:
obj = factory() # Never returns `None`
return obj
Python 中的线程安全吗?是否有场景或实现是线程安全的或不安全的?为什么?
factory
的调用没有副作用(在创建的对象之外)的情况下。 - Davis Herringobj is None
是对obj
的读取,而return obj
则是另一个读取操作,因此存在一种可能的代码路径,即在没有任何同步操作的情况下进行两次obj
的读取。即使在双重检查锁定有效的语言中也可能会出现这种情况;通常需要将obj
读入本地变量以用于测试和返回,以便没有同步操作的代码路径只承载一个读取操作。 - Holger