是|| =在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中)。