Я использовал volatile, где я не уверен, что это необходимо. Я был уверен, что замок в моей ситуации будет излишним. Чтение этой темы (комментарий Эрика Липперта) заставляет меня беспокоиться о том, что я использую volatile: Когда следует использовать ключевое слово volatile в С#?
Я использовал volatile, потому что моя переменная используется в многопоточном контексте, где эта переменная может быть доступна/изменена одновременно, но где я могу потерять добавление без каких-либо проблем (см. код).
Я добавил "volatile", чтобы убедиться, что отсутствует выравнивание пропусков: чтение только 32 бит переменной, а остальные 32 бита на другой выборке, которые могут быть разбиты на 2 путем записи в середине из другого потока.
Может ли мое предыдущее предположение (предыдущее утверждение) действительно произойти? Если нет, используется ли "изменчивое" использование (модификации свойств свойства могут произойти в любом потоке).
Прочитав 2 первых ответа. Я хотел бы настаивать на том, что, как написано код, не важно, если из-за concurrency мы пропустим приращение (хотим увеличивать с 2 потоков, но результат увеличивается только на 1 из-за concurrency), если хотя бы переменная "_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();
}
}