Я прошел следующий тест:
private static object threadLocker = new object();
private static long threadStaticVar;
public static long ThreadStaticVar
{
get
{
lock (threadLocker)
{
return threadStaticVar;
}
}
set
{
lock (threadLocker)
{
threadStaticVar = value;
}
}
}
Parallel.For(0, 20000, (x) =>
{
//lock (threadLocker) // works with this lock
//{
ThreadStaticVar++;
//}
});
Этот Parallel.For
вызывает метод, передавая значения от 0 до 19999. Таким образом, он будет выполнен 20 раз.
Если я не оберну ThreadStaticVar++;
с lock
, хотя он имеет блокировку на get
и set
, результат не будет 20000
. Если я уберу комментарий и заблокирую его внутри .For
, он получит правильное значение.
Мой вопрос: как это работает? Почему блокировка на get
и set
не работает? Почему это работает только внутри моего For
?