У меня есть список, к которому обращаются несколько фоновых потоков для обновления/чтения. Действия по обновлению включают как вставки, так и удаления.
Чтобы сделать это одновременно без проблем с синхронизацией, я использую блокировку частного объекта только для чтения в классе.
Чтобы свести к минимуму время, необходимое для блокировки списка при чтении его данных, я делаю его глубокое клонирование, возвращаю глубокое клонирование и разблокирую словарь для вставки/удаления обновлений.
Из-за этого каждое чтение списка увеличивает потребление памяти моей службой.
Следует отметить, что вставки/удаления являются внутренними для класса, содержащего список. Но чтение предназначено для общественного потребления.
Мой вопрос:
Есть ли способ избежать клонирования списка и по-прежнему использовать его одновременно для чтения с использованием блокировок чтения/записи?
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();
}
}
}
}
.Values
, что является копированием при чтении. 24.04.2012