更新/読み取りのために複数のバックグラウンドスレッドからアクセスされるリストがあります。更新アクションには、挿入と削除の両方が含まれます。
同期の問題なしにこれを同時に行うために、クラス内のプライベート読み取り専用オブジェクトのロックを使用しています。
データを読み取るときにリストをロックする必要がある時間を最小限に抑えるために、リストのディープクローンを作成し、ディープクローンを返し、更新の挿入/削除のためにディクショナリのロックを解除します。
このため、リストを読み取るたびに、サービスのメモリ消費量が増加します。
注意すべき点の1つは、挿入/削除はリストを含むクラスの内部にあるということです。しかし、読み取りは一般消費を目的としています。
私の質問は:
リストのクローンを作成せずに、読み取り/書き込みロックを使用した読み取りに同時に使用する方法はありますか?
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();
}
}
}
}