ruby - ruby MRI 中的赋值是原子操作吗?

标签 ruby concurrency atomic mri

假设我的类中有这两个方法。

def set_val(val)
  @val = val
end

def get_val
  @val
end

我将生成多个线程来使用不同的值调用 set_val。是否保证从 @val 读取返回正确的值,即不是最后分配的值,而是传递给 set_val 的值?我在阅读时会发现一些奇怪的东西吗?赋值操作是原子的吗?无论线程数多少,它都是不可分割的吗?

最佳答案

这在一定程度上取决于您所使用的 Ruby 实现。至于 MRI Ruby(“默认”Ruby),这是一个安全(原子)操作,因为它的全局解释器锁可以保护某些操作,例如分配,以免被上下文切换中断。

JRuby 也 guarantees某些操作是线程安全的,包括对实例变量的赋值。

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

关于ruby - ruby MRI 中的赋值是原子操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55029799/

相关文章:

ruby-on-rails - has_many :through how it works?

java - 尽管进行了 null 检查,但在多线程环境中仍获取 NullPointerException

c - 实现临界区

java - 赋值和函数值计算是原子操作吗?

ruby - 如何在运行时在 ruby​​ 中设置命名空间?

ruby-on-rails - Ruby 编码问题

Java/Groovy 线程退出操作

MySQL InnoDB "SELECT FOR UPDATE"- 跳过锁定等效

c++ - 在 C++ 中使用原子 TestAndSet 混合无锁和全锁线程同步

ruby-on-rails - 如何在 Ruby 中组合图像