9

例如,以下方法:

class MyClass
  self.perform(id)
    hash = doSomething(id)
    doMoreStuff(hash)
    return hash
  end
end

我担心的是如果我有多个线程调用MyClass.perform(). 该对象hash是否可能被另一个线程覆盖?换句话说,线程 1 调用doSomething并获取返回的哈希值{1 => 1}。但紧接着线程 2 调用doSomething并获得{2 => 2}. 现在会发生什么?线程 1 的哈希是否更改为{2 => 2}

还是每个线程都独立工作hash,其他线程永远无法触及?假设doSomething并且doMoreStuff已经是线程安全的。

如果重要的话,我使用的是 Rails 3.0。

4

2 回答 2

18

局部变量,例如 your hash,对于周围方法的特定调用是局部的。如果两个线程最终同时调用perform,那么每个调用都将获得自己的执行上下文,并且除非涉及共享资源,否则它们不会重叠:实例变量(@hash),类变量(@@hash),全局变量($hash),...可能会导致并发问题。使用像您的perform.

但是,如果perform正在创建线程并且您最终在内部使用了闭包perform,那么您最终可能会得到多个线程引用通过闭包捕获的相同局部变量。因此,当您创建线程时,您必须小心范围问题,但在处理仅适用于局部变量的简单方法时,您不必担心它。

于 2012-12-05T07:42:28.167 回答
3

作为“类方法”的东西(它只是类对象上的单例方法)并不比作为实例方法更具有线程安全性。

于 2012-12-05T02:44:15.573 回答