Используйте другой объект для блокировки.
int valueType;
object valueTypeLock = new object();
void Foo()
{
lock (valueTypeLock)
{
valueType = 0;
}
}
Зависьте от своей ситуации, Вы смогли избегать использования блокировок путем усиления Системы. Поточная обработка. Взаимно блокируемый тот же код в примере Jon становится:
System.Threading.Interlocked.Exchange(valueType,0)
Ваш вопрос сформулирован таким способом, которым он предлагает мне, чтобы Вы не полностью понимали блокировку. Вы не блокируете данные, Вы блокируете для защиты целостности данных. Объект, который Вы соединяете, несуществен. То, что имеет значение, - то, что Вы соединяете тот же объект в других областях Вашего кода, которые изменяют защищаемые данные.
Я всегда использую отдельную переменную для соединений:
object syncObj = new object();
void Foo()
{
lock(syncObj)
{
// do some stuff
}
}
Соединяющиеся типы значения не имеют смысла так или иначе, потому что типы значения неизменны и не могут быть изменены. Соединение 'этого' также проблематично, потому что 'это' видимо к внешнему миру.
Для некоторой информации о том, как Монитор был первоначально предназначен, чтобы использоваться, см. Монитор (синхронизация)