好奇心杀了猫,但我忍不住......所以我问: - )。
有很多建议可以避免volatile
。所以我想知道什么是正确/合理的替代 - 个人锁定,即你有变量x
所以你将它包装在setter / getter中,并为它创建了锁:
private volatile bool x; // previously
// replacement
private readonly object x_lock = new object();
private bool __x;
private bool x {
get { lock (x_lock) return __x; } ...
或者最好使用Interlocked
方法(使用no-op CompareExchange
进行阅读):
private bool x {
get { return Interlocked.CompareExchange(ref __x,false,false); }
...
我使用bool
类型来避免讨论复合操作的问题,例如当你必须在一个原子步骤中读取和写入值时int
的经典增量。 volatile
首先对此类案件没有帮助,所以这里不是主题。
更新:这是来自Eric Lippert博客的报道"挥发性字段表明你正在做一些彻头彻尾的疯狂:你试图在两个不同的地方读取和写入相同的值线程没有锁定到位#34;。这开始了我的想法(到现在为止,我没有看到任何关于旗帜的疯狂)。但缺乏证据并不是缺席的证据......