我有一个用 Ruby 编写的高度多线程的应用程序,它共享一些实例变量。对这些变量的写入很少 (1%),而读取非常常见 (99%)。确保这些线程始终看到所涉及的最新值的最佳方式是什么(在您看来或以惯用的 Ruby 方式)?到目前为止,这是我的一些想法(尽管在我大修之前我希望得到您的意见):
- 在读取或写入任何这些变量之前拥有一个最常用的锁(来自Java Concurrency in Practice)。这样做的缺点是它
synchronize
在我的代码中放置了很多块,而且我没有看到一个简单的方法来避免它。 - 使用 Ruby 的
freeze
方法(请参阅此处),尽管它看起来同样繁琐,并且没有给我任何第一个选项所提供的同步优势。
这些选项看起来都非常相似,但希望那里的任何人都会有一个更好的想法(或者可以为其中一个想法辩护)。我也可以使对象不可变,这样它们就不会在操作过程中被破坏或改变,但是我对 Ruby 的了解不够,无法自己进行调用,这个问题似乎认为对象是高度可变的。