Просто чтобы добавить к обсуждению (почему бы и нет?): Да, свойство static
является общим для всех экземпляров класса, независимо от потока (если поле поддержки не помечено ThreadStatic
, то есть!).Но да, есть потенциальные проблемы с многопоточностью, с которыми вам приходится сталкиваться при работе с такими свойствами.Вот сценарий, к которому, я думаю, другие стремятся.
Рассмотрим этот код:
int x = MyClass.StaticProperty;
MyClass.StaticProperty = x + 1;
Предыдущий пример - очень простой пример того, как из-за состояния гонки два потока могут выполнить то, что есть предполагается, что является двумя неделимыми действиями, но вместо этого фактически оказывается единым действием.
Для иллюстрации:
Thread 1 Thread 2
int x = MyClass.StaticProperty; // Let's say
int x = MyClass.StaticProperty; // this is 1.
MyClass.StaticProperty = x + 1; // OK, so x is
MyClass.StaticProperty = x + 1; // now... 2.
Видите ли вы проблему?Оба потока могут оба прочитать значение свойства перед тем, как один из них записывает в него;и записываемое в него значение зависит от прочитанного значения, которое было одинаковым для обоих потоков!
В простых сценариях, подобных приведенному выше, в * есть удобный класс1025 * пространство имен, которое может сделать многопоточное чтение / запись довольно безболезненным для реализации: Interlocked
.Например, для увеличения на StaticProperty
выше потокобезопасным способом вы можете обновить MyClass
следующим образом:
class MyClass
static int _staticProperty;
public static int StaticProperty
{
get { return _staticProperty; }
}
public static int IncrementProperty()
{
// increments _staticProperty ATOMICALLY
// and returns its previous value
return Interlocked.Increment(_staticProperty);
}
}
В более сложных сценариях (т. Е. Когда вы не просто изменяете простые числовые поляпростым способом) вам может потребоваться разработать собственную стратегию синхронизации, наиболее распространенной из которых является наличие назначенного объекта блокировки и просто lock
на нем для каждой операции, которую вы хотите вести атомарно.