我在使用volatile时,不确定是否必要。我相当确定在我的情况下,使用锁会过度。阅读这个线程(Eric Lippert的评论)使我对使用volatile感到不安:When should the volatile keyword be used in c# ?
我使用volatile,因为我的变量在多线程环境中使用,在这种情况下,该变量可能会被并发访问/修改,但我可以在没有任何伤害的情况下丢失一个加法(参见代码)。
我添加了“volatile”以确保没有出现错位:仅读取32位变量的另外32位在另一个获取中,并且可以通过中间来自另一个线程的写入而被拆分成2个。
我的先前假设(前面的声明)是否真的会发生?如果不是,那么“volatile”使用是否仍然必要(选项属性修改可以在任何线程中发生)。
阅读前两篇答案后。我想坚持认为,由于代码编写方式,如果由于并发性我们错过了增量(想要从2个线程增加,但由于并发性导致结果只增加了一个),则至少变量'_actualVersion'增加是重要的。
这是我在使用它的代码部分作为参考。它用于仅在应用程序空闲时报告保存操作(写入磁盘)。
public abstract class OptionsBase : NotifyPropertyChangedBase
{
private string _path;
volatile private int _savedVersion = 0;
volatile private int _actualVersion = 0;
// ******************************************************************
void OptionsBase_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
_actualVersion++;
Application.Current.Dispatcher.BeginInvoke(new Action(InternalSave), DispatcherPriority.ApplicationIdle);
}
// ******************************************************************
private void InternalSave()
{
if (_actualVersion != _savedVersion)
{
_savedVersion = _actualVersion;
Save();
}
}
// ******************************************************************
/// <summary>
/// Save Options
/// </summary>
private void Save()
{
using (XmlTextWriter writer = new XmlTextWriter(_path, null))
{
writer.Formatting = Formatting.Indented;
XmlSerializer x = new XmlSerializer(this.GetType());
x.Serialize(writer, this);
writer.Close();
}
}