Что было бы не так с
private int val = 10;
private var valLock = new object();
private int nonVolatileNumber = 50;
private var nonVolatileNumberLock = new object();
public int Value
{
get { lock(valLock) return val; }
set { lock(valLock) val = value; }
}
public int NonVolatileNumber
{
get { lock(nonVolatileNumberLock) return nonVolatileNumber; }
set { lock(nonVolatileNumberLock) nonVolatileNumber = value; }
}
, единственный риск здесь заключается в том, что последующий код получает доступ к приватному члену свойства.
В случае 32-битных целых или даже 64-битных целых чисел в 64-битной системе, поскольку чтение будет атомарным, вы можете использовать класс Interlocked , например, такой ...
private int val = 10;
public int Value
{
get { return val; }
set { Interlocked.Exchange(ref val, value); }
}
Или в случае более сложного типа вы можете использовать ReadWriterLockSlim ...
private SomeStructure complex;
private var complexLock = new ReadWriterLockSlim();
public SomeStructure Complex
{
get
{
complexLock.EnterReadLock();
try
{
return complex;
}
finally
{
complexLock.ExitReadlock();
}
}
set
{
complexLock.EnterWriteLock();
try
{
return complex;
}
finally
{
complexLock.ExitWritelock();
}
}
}
Это лучше, чем стандартная блокировка, поскольку она допускает многократное одновременное чтение.