什麼是錯
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位整數的情況下,becasue的讀取西港島線是原子,你可以使用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();
}
}
}
這是一個比一個標準的鎖更好,因爲它允許多個併發的讀寫。
請注意'Interlocked'類。 – SLaks
遞增是一個錯誤的例子。請參閱更新後的問題 – Jon
這將串行化所有對'ChangeValue'的調用,我懷疑是您想要的。 – Jodrell