2012-12-05 136 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的要求,所以請不要低估這個答案。 –