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

Bri*_*uez 13 python multithreading language-lawyer

双重检查锁定习语是不是在某些语言可靠,我想知道的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
Run Code Online (Sandbox Code Playgroud)

... Python中的线程安全?有没有的场景/实现?为什么?

Mic*_*tor 2

查看PEP 583 - Python 的并发内存模型,该模型已被撤回。

我猜它被撤回的原因(尽管我找不到足够的信息)是因为Python 有不同的实现,并且很难在每个实现上强制执行这样的标准。

结论:在单处理器上使用 CPython 实现时,此代码可能是安全的,或者通常使用 Jython 实现来使用它可能是安全的,但不能保证。