繁体   English   中英

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

[英]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 假设doSomethingdoMoreStuff已经是线程安全的。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM