В общеизвестных Joseph Albahari's article on Threading все переменные класса, используемые несколькими потоками, объявляются как static
fields => все потоки имеют доступ к одной и той же переменной. Это должно быть оборудовано механизмом lock()
во всех местах чтения/записи, и работа выполнена.Обмен данными во время многопоточности - это нестатические переменные ОК?
Мой вопрос о реализации свойств класса. Я понимаю, что это справедливо, если я реализую (например) имущества Timeout
используя static
подкладочный магазин:
class MyClassWithWorkerThread {
private readonly object _locker = new object();
private static int _Timeout = false;
private int Timeout {
get {
lock (_locker) {
return _Timeout;
}
}
set {
lock (_locker) {
_Timeout = value;
}
}
}
}
Это делает переменную _Timeout
общего числа всех экземпляров класса.
Но в моем случае многопоточная обработка является частной для экземпляра класса. Он начинается с New()
и заканчивается Dispose()
. Как основной поток, так и рабочий доступ к потоку Timeout
(но _Timeout
бэкэйд-магазин никогда не открывается за пределами объекта getter/setter).
Я не хочу _Timeout
ценность быть прикладной. Я хочу, чтобы он был уникальным для каждого экземпляра класса. Мой вопрос: могу ли я безопасно удалить static
от _Timeout
переменной, чтобы достичь этого?
Примечание: Извините, если в коде есть ошибки, я фактически использую VB.NET, и я преобразовал его с помощью инструмента. Надеюсь, главный вопрос остается ясным.
Я полностью согласен с использованием блоков 'lock()' (VB: 'SyncLock ... End SyncLock'), которые вы описываете. На самом деле я намеревался избежать сценариев, которые вы выделили, создав локальную копию «Timeout» (с помощью операции однократного чтения), когда это необходимо, поскольку в методах класса она не записывается. Я не уточнил этот вопрос, но понимаю эту концепцию блокировки. Но, по крайней мере, другие читатели получат выгоду от вашего подробного ответа, поэтому спасибо. – miroxlav
Летучие поля * очень атомные. Очевидно, что выполнение двух операций по порядку не является атомарным, но затем не блокируется дважды в последовательности. – Voo
@Voo, что вы правы, мое предложение довольно неясно: _access_ для переменных volatile является атомарным, но операторы, которые _seems_ для выполнения атомной операции, не являются (например, ++). –