並行コレクションは、コレクション自体を安全に変更する手段として意図されていました。アイテムではありません。独自の同期プリミティブをCell
クラスに追加する必要があります。外部インスタンスと内部List
インスタンス自体が変更されない場合は、それらに同期を適用する必要はありません。
あなたは多くの読者を持つことになると言いましたが、書き手は 1 人だけです。それは信じられないほど重要な詳細です。これは、ロックのない同期戦略の実装が劇的に容易になることを意味します。ただし、正しい道をたどるのはまだかなり難しいので、その道をたどることはお勧めしません。ただし、が よりも優れたパフォーマンスを発揮するReaderWriterLockSlim
可能性があることも意味しlock
ます。
どちらが保守性と効率性の最適なバランスを提供するかを確認するには、両方を試してみる必要があります。lock
複数のリーダーと 1 つのライターを使用する場合でも、従来型の方が高速に動作することがわかると思いますが、テストする価値はあります。コードを入力するときは、確かに指がはるかに簡単です。
両方のサンプル コードを次に示します。
public class Cell
{
private object m_LockObject = new object();
public object ReadMyState()
{
lock (m_LockObject)
{
// Return the data here.
}
}
public void ChangeMyState()
{
lock (m_LockObject)
{
// Make your changes here.
}
}
}
と
public class Cell
{
private ReaderWriterLockSlim m_LockObject = new ReaderWriterLockSlim();
public object ReadMyState()
{
m_LockObject.EnterReadLock();
try
{
// Return the data here.
}
finally
{
m_LockObject.ExitReadLock();
}
}
public void ChangeMyState()
{
m_LockObject.EnterWriteLock();
try
{
// Make your changes here.
}
finally
{
m_LockObject.ExitWriteLock();
}
}
}