在红宝石MRI中分配是原子操作吗?

时间:2019-03-06 18:20:41

标签: ruby concurrency atomic atomicity mri

假设我的班上有这两种方法。

def set_val(val)
  @val = val
end

def get_val
  @val
end

我将产生多个线程以不同的值调用set_val。是否可以保证从@val读取将返回正确的值,即不是最后分配的值,而是传递给set_val的值?阅读时我能得到一些奇怪的东西吗?分配操作是原子的吗?是否与线程数无关地不可分割?

1 个答案:

答案 0 :(得分:2)

这取决于您使用的Ruby实现。对于MRI Ruby(“默认” Ruby)而言,这是一种安全的操作(原子操作),因为它具有全局解释器锁,可以保护某些操作,例如分配操作不会被上下文开关中断。

JRuby还guarantees认为某些操作是线程安全的,包括分配给实例变量。

无论如何,请确保考虑到任何此类并发访问都可以看似随机的方式进行序列化。也就是说,除非您使用显式锁(例如Mutex),否则您不能保证哪个线程首先分配,哪个线程最后分配。