如果我可以保证自己整个应用程序中只有一种方法可以写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗?
如果是这样,我可以在不锁定变量的情况下逃脱该噱头吗?
在这种情况下,我正在做(或者,尝试做或想要做)是一个线程中的一个方法将值放入变量,然后其他线程中的其他方法将读取该值并做出决定。
一个非常好的选择是锁定写入,同时允许读取。
在这里查看MSDN page on lock并没有找到办法做到这一点。
答案 0 :(得分:12)
与往常一样,它在很大程度上取决于背景。
volatile
会解决这个问题,但是作为副作用而不是明确的意图;大多数人(包括我)无法正确定义volatile
的含义 - 所以要非常小心地将其用作“修复”。 但是,Interlocked
可以在不需要lock
的情况下解决大部分问题。与此同时,一个无可争议的lock
疯狂快,甚至有争议的lock
仍然惊人地快。坦率地说,我不确定你给它的想法是否值得:平坦的lock
几乎肯定是足够快的,只要你先思考在外面 { {1}},当您知道要进行的更改时,只有lock
。
还有 lock
,但实际上提高性能的案例数量很少 - 根据我的经验,最简单的方法通常是最快,意味着ReaderWriterLockSlim
或lock
。 Interlocked
是一个更复杂的野兽,专为更复杂的场景而设计,因此具有一点开销。不是大量的金额,但足以让它值得仔细查看。