假设我班上有这两种方法。
def set_val(val)
@val = val
end
def get_val
@val
end
我将生成多个线程来调用具有不同值的set_val
。是否保证从@val
读取返回正确的值,即不是最后指定的值,而是传递给set_val
的值?读书时我能得到一些奇怪的东西吗?赋值操作是原子的吗?无论线程数多少,它都是不可分割的吗?
这取决于您正在使用的Ruby实现。至于MRI Ruby(“默认”Ruby),这是一个安全(原子)操作,因为它的全局解释器锁可以保护某些操作,例如由上下文切换中断的bein。
JRuby还guarantees表示某些操作是线程安全的,包括赋值给实例变量。
在任何情况下,请务必考虑任何此类并发访问可以以看似随机的方式序列化。也就是说,除非使用显式锁,例如Mutex,否则无法保证哪个线程首先分配哪个线程以及哪个线程最后分配。