Ruby类方法是否是线程安全的?

时间:2012-12-05 02:33:38

标签: ruby methods thread-safety

例如,方法如:

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上工作,其他线程永远无法触及?假设doSomethingdoMoreStuff已经是线程安全的。

如果重要,我正在使用Rails 3.0。

2 个答案:

答案 0 :(得分:16)

局部变量(例如hash)对于周围方法的特定调用是本地的。如果两个线程最终同时调用perform,那么每个调用将获得自己的执行上下文,除非涉及共享资源,否则它们不会重叠:实例变量(@hash),类变量(@@hash),globals($hash),...可能导致并发问题。没有什么可以像你的perform一样简单地用线程来担心。

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

答案 1 :(得分:1)

某些东西是“类方法”(它只是类对象上的单例方法)并不会使它比作为实例方法更加线程安全。