私は、複数のバックグラウンドスレッドからアクセスして更新/読み取りを行うリストを持っています。更新アクションには、挿入と削除の両方が含まれます。同時辞書アクセスの効率を向上させるC#
これを同期の問題なしで同時に実行するには、クラスのプライベート読み取り専用オブジェクトにロックを使用しています。
データを読み込むときにリストをロックする時間を最小限に抑えるために、私はそれを深くクローンしてディープクローンを返し、ディクショナリのロックを解除して更新の挿入/削除を行います。
これにより、このリストが読み込まれるたびに、私のサービスのメモリ消費が増加します。
注意点は、挿入/削除がリストを含むクラスの内部にあることです。しかし、読み物は一般消費のためのものです。
私の質問は次のとおりです。
は、どのような方法があり、私はリストをクローニング回避することができ、まだ読み取り/書き込みロックを使用して読み込むため、同時にそれを使うのか?
public class ServiceCache
{
private static List<Users> activeUsers;
private static readonly object lockObject = new object();
private static ServiceCache instance = new ServiceCache();
public static ServiceCache Instance
{
get
{
return instance;
}
}
private void AddUser(User newUser)
{
lock (lockObject)
{
//... add user logic
}
}
private void RemoveUser(User currentUser)
{
lock (lockObject)
{
//... remove user logic
}
}
public List<Users> ActiveUsers
{
get
{
lock (lockObject)
{
//The cache returns deep copies of the users it holds, not links to the actual data.
return activeUsers.Select(au => au.DeepCopy()).ToList();
}
}
}
}
で動作する単一のロックを使用するすべての機能を公開し
不変でなければなりませんあなたの仕事が有意義に同期されていることを確認する方法は? –
Ericでは、ディープコピーは、キャッシュのスナップショットとしてのみ使用されることを意図しており、変更は実際のキャッシュに反映されるべきではありません。 – EndlessSpace
サイドノート:「時間を最小限に抑えるには...私はそれを深くクローンします」:これは「すべての悪の早期最適化ルート」が存在する正確な理由です。重要でないオブジェクトの深いクローンは速い操作であるとは考えにくいです。あなたは常にあなたの「最適化」が実際に何であるかを理解するために測定するべきです。 –