是|| =在Ruby线程安全吗?

不确定线程​​安全是否适用于||=

最初是关于ActiveSupport :: Memoizable的,并且想知道那里的线程安全性。

这取决于实施。 请注意, x ||= y会扩展为x || x = y x || x = y ,并且只有在x既不是false也不是nil时才执行x = y

话虽如此,Ruby语言的C实现应该是完全线程安全的。

YARV使用本机线程来实现并发,它以真正的并行方式运行。 但是,为了保持向后兼容性,引入了全局,解释器范围的锁 。

但是,JRuby对代码没有内部锁定,因此您必须在需要时手动同步调用。

有关详细信息,请参阅我给出的有关该主题的另一个答案 。 另外,请阅读JörgWMittag的这个优秀答案,以便更深入地了解各种Ruby实现的线程模型。

Luca Guidi 在Ruby中关于线程安全概念的这篇伟大post表明||=不是线程安全的(至少在MRI中)。