假设我的班上有这两种方法。
def set_val(val)
@val = val
end
def get_val
@val
end
我将产生多个线程以不同的值调用set_val
。是否可以保证从@val
读取将返回正确的值,即不是最后分配的值,而是传递给set_val
的值?阅读时我能得到一些奇怪的东西吗?分配操作是原子的吗?是否与线程数无关地不可分割?
答案 0 :(得分:2)
这取决于您使用的Ruby实现。对于MRI Ruby(“默认” Ruby)而言,这是一种安全的操作(原子操作),因为它具有全局解释器锁,可以保护某些操作,例如分配操作不会被上下文开关中断。
JRuby还guarantees认为某些操作是线程安全的,包括分配给实例变量。
无论如何,请确保考虑到任何此类并发访问都可以看似随机的方式进行序列化。也就是说,除非您使用显式锁(例如Mutex),否则您不能保证哪个线程首先分配,哪个线程最后分配。