は何
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ビットの整数の場合
、WILがアトミックで読み取っbecasue、あなたが
private int val = 10;
public int Value
{
get { return val; }
set { Interlocked.Exchange(ref val, value); }
}
かの場合には...このようInterlockedクラスを使用することができますあなたはそれが複数の同時読み取りができますので、これは、標準的なロックよりも優れている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();
}
}
}
を使用することができ、より複雑なタイプ。
'Interlocked'クラスに注意してください。 – SLaks
インクリメントが間違った例でした。更新された質問 – Jon
を参照してください。これは 'ChangeValue'へのすべての呼び出しを連載します。 – Jodrell