업데이트/읽기를 위해 여러 백그라운드 스레드가 액세스하는 목록이 있습니다. 업데이트 작업에는 삽입과 삭제가 모두 포함됩니다.동시 사전 액세스의 효율성 향상 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
사이드 노트 : "시간을 최소화하기 위해 ... 나는 그것의 진품을 만듭니다": 이것은 "모든 악의 조기 최적화 루트"라는 문구가 존재하는 정확한 이유입니다. 중요하지 않은 개체의 딥 클론은 빠른 작업이 아닐 것입니다. 당신은 항상 당신의 "최적화"가 실제로 무엇인지 이해해야합니다. –