5

去年五月在波特兰的 Railsconf 上,我参加了一个演讲,有人认为,在 Rails 中,Ruby 类成员变量,如 @@foo,是危险的,因为它们本质上是非线程安全的。

之后我研究了这个问题,但我从来没有找到一个真正充实这个问题的链接。我将不胜感激指向一篇关于 Rails 和线程的好文章,该文章真正涉及到类成员问题。另外,很高兴知道 Rail 2+ 和 Yarv 在这方面是如何改变的。

编辑:

也许我对演示文稿的记忆模糊不清,但我记得@@foo 的问题超出了通常的警告,即必须严格控制任何共享变量访问。我知道 Ruby 代码本身存在内存泄漏,不久前已修复。我正在寻找有关 Ruby 共享变量和多任务处理的文章链接,越深入越好。*目前我不使用类变量来做任何事情,但是在某些情况下能够使用它们会很好。

4

2 回答 2

5

任何共享的可变状态本质上都是线程不安全的。您需要锁定所有访问以确保一切安全,并确保一切都是可重入的。 @@foo尤其糟糕,因为任何子类都可以访问该变量,因此更难审计代码。Rails 2+ 只是通过审核所有内容并确保在必要时使用互斥锁和其他同步原语来“解决”这个问题。

于 2009-02-20T02:26:37.520 回答
1

我认为它们和以往一样好,但在可能多次加载类的 Rails 环境中仍需谨慎使用(例如,如果您使用 mongrel,则每个 mongrel 一次),因此类成员变量可以在这些过程中独立变化。

我认为Ruby 1.9 中 @@ 变量的作用域发生了变化,这可能应该被考虑在内 - 我们总有一天会在那里。

你有什么特别的用途吗?我以为我最近需要一个,但事实证明这是我对这个主题的(粗略)理解的一个错误——我真正需要的是类上的一个实例变量。(我正在构建一个模块来扩展一个类,以便我可以添加一些 AR 风格的声明性宏优点。)

于 2009-02-20T12:27:24.893 回答