항목이없는 경우 해당 항목을 요청한 한 사람 만이 항목을 생성하는 데 시간을 소비하며 동시에 다른 사용자가 요청하면 동시에 첫 번째 사람이 결과를 캐시 할 때까지 차단하십시오. 1이오고 스레드 1이 캐시에없는 것을보고 캐쉬 된 항목의 단일 작성을 보장하는 캐시
- 스레드 : 여기에 그 시나리오에 대한 설명입니다 A는, 정보가 현재 발생되고 있음을보고 스레드 3도에 와서 정보가 현재 발생되고 있음을 볼 수
- 잠금 어떤 종류의에 대기 잠금 어떤 종류의 대기에
- 스레드 2는 오는
- 스레드 4가 들어와 req 이미 캐시에있는 다른 키에 대한 데이터를 유실하고 전혀 기다리지 않습니다.
- 스레드 1이 생성을 완료하고
- 값으로 캐시를 업데이트합니다. 스레드 2와 3이 모두 일어나서 결과를 얻습니다. 이제 캐시에
ConcurrentDictionary<DateTime, CustomImmutableObject> _cache;
같은 키처럼 날짜를 저장하는 날짜 시간으로 ConcurrentDictionary에 캐시있을 것입니다하지만 스레드 2, 3 것이 얼마나 내가 볼 수없는 생각
뭔가를 기다릴 수 있습니다. 일종의 상태 플래그를 저장 한 다른 ConcurrentDictionary가 있더라도 스레드 1이 완료되면 어떻게 알 수 있습니까?
누구나 그러한 캐시를 개발하는 방법에 대한 제안이 있습니까?
감사합니다. 좋은 해결책 인 것 같습니다. relfector에서 Lazy을 보는 것은 기본적으로 Tuple
참으로. 개인적으로 ConcurrentDictionary의 GetOrAdd 메서드에 적용된 동일한 접근 방식을 보았을 것이지만 동시 사용에서는 추가 대리자를 두 번 이상 호출 할 수 있으며 반환 값은 하나만 제외하고 모두 무시됩니다. 물론 Lazy를 사용하면이 문제를 완화 할 수 있습니다. – spender
"ConcurrentDictionary의 GetOrAdd 메서드에 동일한 접근 방식을 적용한 것이 좋았을 것입니다."-이 접근 방식은 잠금이 유지되는 동안 추가 대리자에서 호출 된 임의의 외부 코드가 디버깅을 어렵게하는 원인이 될 수 있습니다 버그 (재 입력, 장기간 잠금 장치). IMHO는 현재의 디자인이 가장 좋은 절충안입니다. – Joe