例如,方法如:
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。
答案 0 :(得分:16)
局部变量(例如hash
)对于周围方法的特定调用是本地的。如果两个线程最终同时调用perform
,那么每个调用将获得自己的执行上下文,除非涉及共享资源,否则它们不会重叠:实例变量(@hash
),类变量(@@hash
),globals($hash
),...可能导致并发问题。没有什么可以像你的perform
一样简单地用线程来担心。
但是,如果perform
正在创建线程并且您最终在perform
内部出现了闭包,那么最终会有几个线程引用通过闭包捕获的相同局部变量。因此,在创建线程时必须注意范围问题,但在处理仅适用于局部变量的简单方法时,您不必担心它。
答案 1 :(得分:1)
某些东西是“类方法”(它只是类对象上的单例方法)并不会使它比作为实例方法更加线程安全。