Python中的双重检查锁定线程安全吗?

Python中的双重检查锁定线程安全吗?,python,multithreading,language-lawyer,Python,Multithreading,Language Lawyer,这个习语在某些语言中不可靠,我想知道Python是否是其中之一。更具体地说,是以下代码 #线程共享的对象: obj=无 lock_for_obj=线程。lock() def get_obj(): “”“由线程并发调用的函数。”“” 如果obj为无: 带有锁定对象的锁定对象: 如果obj为无: obj=factory()#从不返回'None'` 返回obj …Python中的线程安全?是否存在场景/实现?为什么?看一看,它被撤回了 我想它被撤销的原因(尽管我找不到足够的信息)是因为有,而且很难对

这个习语在某些语言中不可靠,我想知道Python是否是其中之一。更具体地说,是以下代码

#线程共享的对象:
obj=无
lock_for_obj=线程。lock()
def get_obj():
“”“由线程并发调用的函数。”“”
如果obj为无:
带有锁定对象的锁定对象:
如果obj为无:
obj=factory()#从不返回'None'`
返回obj
…Python中的线程安全?是否存在场景/实现?为什么?

看一看,它被撤回了

我想它被撤销的原因(尽管我找不到足够的信息)是因为有,而且很难对每一个都实施这样的标准


结论:在单处理器上使用CPython实现时,此代码可能是安全的,或者在一般情况下使用Jython实现可能是安全的,但是没有保证。

您假设在另一个线程修改缓存时对其执行查找是安全的。即使使用GIL(并非所有Python实现都有GIL),这也不是完全安全的。@user2357112:什么缓存?处理器缓存?我愿意相信一个无GIL的实现可能有不同的安全规则,但是如果GIL没有提供缓存一致性,CPython中的一切不是都会被破坏吗?@DavisHerring啊,他们回答的是我编辑掉的问题的前一个版本。@BrianRodriguez:Hm.你问题的原始版本对CPython有一个非常有趣的答案,至少只要调用
工厂
没有副作用(在创建的对象之外).
obj是None
是对
obj
的读取,
return obj
是另一个,因此有一个可能的代码路径在不进行任何同步操作的情况下对
obj
执行两次读取。即使使用双重检查锁定工作的语言,这也可能失败;它们通常需要将
obj
读入一个局部变量以用于测试和返回,因此没有同步操作的代码路径只承担一个读取操作。