2012-12-05 77 views
5

例如,方法如:Ruby类方法是否线程安全?

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。

+0

据我所知,例如,使用rails,它们不是 – macool

+0

您能解释一下您对该方法有哪些线程安全性问题? –

+1

另外,在方法结尾不需要'return'。如果你在最后一行只有'hash',那就是返回值。 –

回答

16

局部变量,例如hash,对于周围方法的特定调用而言是本地变量。如果两个线程最终同时调用perform,那么每个调用将获得自己的执行上下文,除非共享资源涉及:实例变量(@hash),类变量(@@hash),全局变量($hash) ,...会导致并发问题。没有什么需要担心的线程明智的东西像你的perform

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

1

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

+1

@Downvoter当答案写成时,问题非常模糊,我不能提供比这更多的信息。我仍然试图澄清OP的要求,所以请不要低估这个答案。 –