不确定线程安全是否适用于||=
。
最初是关于ActiveSupport::Memoizable的阅读,并对那里的线程安全感到疑惑。
答案 0 :(得分:1)
这取决于实施。请注意,x ||= y
会扩展为x || x = y
,x = y
仅在x
既不是false
也不是nil
时才会执行。
话虽如此,Ruby语言的C实现应该是完全线程安全的。
YARV使用本机线程来实现并发,做以真正的并行方式运行。但是,为了保持向后兼容性,引入了global, interpreter-wide lock。
但是,JRuby对您的代码没有内部锁定,所以必须在需要时手动同步您的电话。有关详细信息,请参阅another answer I've given about the subject。另外,请阅读this excellent answer by Jörg W Mittag以深入了解各种Ruby实现的线程模型。
答案 1 :(得分:0)
Luca Guidi撰写的thread safety concepts in Ruby这篇精彩文章表明,||=
不是线程安全的(至少在MRI中)。