Ruby类成员变量现在好吗?

Joe*_*ger 5 ruby multithreading ruby-on-rails thread-safety

去年五月在波特兰的Railsconf上,我进行了一个演示,其中有人认为,在Rails中,Ruby类成员变量,如@@ foo,是危险的,因为它们本身就是不可读的.

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

编辑:

也许我对演示文稿的记忆是模糊的,但我记得的是@@ foo有一些问题超出了通常的警告,必须严格控制任何共享变量访问.我知道Ruby代码本身存在内存泄漏,这些内容在很久以前就得到了解决.我正在寻找关于Ruby共享变量和多任务的文章链接,越深入越好.*目前我不会因为这个而使用类变量,但在某些情况下能够使用它们会很好.

wom*_*ble 5

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


Mik*_*use 1

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

我认为Ruby 1.9 中 @@ 变量的范围发生了变化,这可能应该被考虑在内 - 有一天我们都会遇到这种情况。

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