lock
само ключевое слово не защитит никакие переменные.
То, что lock
делает, позволяет одному потоку вводить и выполнять следующий блок операторов.
Согласно @Enigmativity made это ясно из комментариев:
Единственный способ, которым работает блокировка, - это если весь доступ к переменной защищен блокировкой.
В вашем случае myConcurrentlyAccessedInt
является не защищенным myLock
, поскольку приращение не выполняется в операторе, защищенном myLock
.
Чтобы получить myLock
для защиты myConcurrentlyAccessedInt
, вам нужно будет читать и писать myConcurrentlyAccessedInt
только в операторах, защищенных с помощью myLock
.
Например, в приведенном ниже коде myConcurrentlyAccessedInt
защищен myLock
:
lock(myLock)
{
this.myTimer = new Timer(_ =>
{
lock(myLock)
{
this.myConcurrentlyAccessedInt += 1;
}
}, null, 1000, Timeout.Infinite);
this.myTimer2 = new Timer(_ =>
{
lock(myLock)
{
this.myConcurrentlyAccessedInt -= 1;
}
}, null, 1000, Timeout.Infinite);
}