【发布时间】:2013-01-08 05:47:39
【问题描述】:
如果我可以保证我的整个应用程序中只有一个方法会写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗?
如果是这样,我可以在不锁定变量的情况下摆脱这个噱头吗?
在这种情况下,我正在做(或者,尝试做,或者想要做)是让一个线程中的一个方法将一个值放入变量中,然后其他线程中的其他方法将读取该值并做出决定。
一个很好的选择是锁定写入,同时允许读取。
在这里查看MSDN page on lock 并没有看到这样做的方法。
【问题讨论】:
-
边读边写并不是最好的主意。当对象已经更新时,您可以阅读混乱。
-
@Kamil 是的,正确的。读完这篇文章后,我对另一个项目进行了第二次检查。
-
@EricPetroelje:请参阅 Marc Gravell 的回答。问题是当更新不是原子的。例如,如果更新的值是一个 int,那么没有问题。如果更新的值是一个由多个整数组成的结构(例如,一个点类),那么它可能是一个真正的问题。这就是马克所说的“撕裂”。
-
@Eric 更改引用确实保证是原子的和安全的;语言保证了这一点。但是,如果代码更新了现有对象的 properties:如果没有同步,坏事可能会发生。如果您有 reference 到 immutable 类,那么您随时可以安全地更改引用... 但是所有调用者都必须PROMISE 为引用 ONCE 拍摄快照,然后使用该快照。不
int x = Foo.X; int y = Foo.Y- 它必须是var snap = Foo; int x = snap.X; int y = snap.Y;