У меня есть список, к которому обращаются несколько потоков фона для обновления/чтения. Действия с обновлениями включают в себя как вставки, так и удаления.повысить эффективность одновременного доступа к словарю C#
Чтобы сделать это одновременно без проблем синхронизации, я использую блокировку для частного объекта readonly в классе.
Чтобы свести к минимуму время, необходимое для блокировки списка при чтении его данных, я делаю глубокий клон и возвращаю глубокий клон и разблокирую словарь для вставки/удаления обновлений.
В связи с этим каждое чтение списка увеличивает потребление памяти моей службой.
Следует отметить, что вставки/удаления являются внутренними для класса, содержащего список. Но чтение предназначено для общественного потребления.
Мой вопрос:
Есть ли способ, я могу избежать клонирования списка и до сих пор использовать его одновременно для чтения с использованием блокировки чтения/записи?
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();
}
}
}
}
Если независимые потоки удаления из их глубокой копии из список, как вы гарантируете, что их работа осмысленно синхронизирована? –
Эрик, глубокая копия предназначена только для моментального снимка кеша во времени, и его изменение не должно отражаться в фактическом кеше. – EndlessSpace
Сторона примечания: «Чтобы свести к минимуму время ... я делаю глубокий клон этого»: это точная причина, почему существует фраза «преждевременный корень оптимизации из всего зла». Глубокий клон любого нетривиального объекта вряд ли будет быстрой операцией. Вы всегда должны измерять, чтобы понять, какова ваша «оптимизация». –