[英]Are Ruby class methods thread-safe?
例如,方法如:
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。
局部变量(例如hash
对于周围方法的特定调用是本地的。 如果两个线程最终同时调用perform
,那么每个调用将获得自己的执行上下文,除非涉及共享资源,否则它们不会重叠:实例变量( @hash
),类变量( @@hash
),全局变量( $hash
),...会导致并发问题。 没有什么可以担心与你的perform
一样简单的线程。
但是,如果perform
正在创建线程并且你最终在内部perform
了闭包,那么最终会有几个线程引用通过闭包捕获的相同局部变量。 因此,在创建线程时必须注意范围问题,但在处理仅适用于局部变量的简单方法时,您不必担心它。
作为“类方法”(它只是类对象上的单例方法)的东西不会使它比作为实例方法更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.