2013-12-16 2 views
0

일회용 객체의 스레드 안전 캐시를 만들어야합니다.일회용 객체의 스레드 안전 캐시 만들기

  1. 내가 캐시 할 것인지, 일부 데이터 클래스가, 전 MyData로
  2. 내가 MyData로
  3. 에 대한 몇 가지 콜렉션 (예를 들어 ConcurrentDictionary)을 만드는거야 내가 방법이 그 새로운 생성 : 나는 그것을 참조하는 방법 일부 키를 사용하여 MyData 인스턴스
  4. 일부 키에 대해 MyData를 가져와야 할 때 저장소에 있는지 확인한 다음 컬렉션에서 사용하고 다른 인스턴스를 만들고 컬렉션에 넣습니다.
  5. 캐시를 무효화해야하는 경우 몇 가지 이벤트가 있습니다. 이 이벤트에서 스토리지를 지 웁니다.

일부 MyData는 일회용입니다. 언제 Dispose 메서드를 호출해야하는지 모르겠습니다. 일부 스레드가 MyData의이 인스턴스를 잠시 사용할 수 있기 때문에 clear-cache 이벤트에서 콜렉션을 지울 때 Dispose 메서드를 호출 할 수 없습니다.

어떤 패턴을 선택해야합니까?

+0

개체가 많은 소비자들 사이에서 공유되는 경우 정확하게 누가 'Dispose'를 호출하는지는 중요하지 않습니다. 모든 소비자는 문제없이 일하기 위해 협력해야합니다.아마도'ObjectDisposedException'을 잡을 준비가되어 있어야합니다. – Jon

+0

같은 유형의 개체입니까? –

+0

@ LasseV.Karlsen 어떤 종류의 디 센스가 동일한 유형으로 만들어지면 모두 IDissposable입니까? – Liran

답변

2

이 경우 동시 수집의 의미는별로 없습니다. 캐시는 캐시에서 항목과 함께 현재 작업을 완료 할 수 있어야합니다. 실제로은 동기화가 필요합니다.

여기에서 할 수있는 가장 확실한 것은 ReaderWriteLockSlim 및 일반 약 Dictionary<TKey, TValue> 주위의 래퍼를 사용하는 것입니다.

캐시에서 항목을 사용하려면 읽기 액세스 권한을 얻습니다. 누군가가 캐시를 수정 (항목 추가 또는 캐시 무효화)하려고하면 쓰기 액세스를 얻습니다 (따라서 마지막 판독기가 잠금을 해제하지 않을 때까지 작성자는 캐시를 무효화 할 수 없습니다).

또 다른 옵션은 접근 방식을 고려하여 ObjectDisposedException을 잡는 것입니다. 그러나이 접근법에서는 직각 작동이 외부에서 중단 될 수 있다고 가정합니다.

+0

처분과 관련이있는 것은 무엇입니까? –

1

당신은 캐시 메커니즘을 캡슐화해야한다고 생각합니다. 아무도 사전을 감싸는 객체를 처리해야합니다. 외부 중재가 없으면 아무도 그것을 처리하지 말아야합니다. (여기서 Singleton 패턴은 좋을 것이고, 사전에 대한 모든 접근은 잠겨 야합니다. 당신이 캐시를 무효로 할 경우 캐시를 다시 잠그고 그것을 지우십시오. 싱글 톤과 관련하여 도움이 필요하면 말해주십시오.

+0

답장을 보내 주신 Thx! 주요 문제는 내 현재의 desing 캐시 클래스에서 Exectly MyData의이 인스턴스를 사용하는 사람이라고 말할 수 없다는 것입니다. 그래서 그것을 처리 할 수 ​​없습니다. 이제 스레드에 대한 몇 가지 메서드를 만들 것이라고 생각하므로 MyData 사용을 시작하고 종료 할 때 캐시 클래스에 알릴 수 있습니다. 따라서 이벤트가 발생하면 컬렉션을 지우고 사용하지 않는 모든 인스턴스를 처리 한 다음 사용량이 많은 항목을 해제 할 때 무료로 가져옵니다. – Yavanosta

+0

그게 싱글 톤과 잠금하지만 잠금을 잊어 버리는 이유는 @dennis가 ReaderWriteLockSlim로 제안한 접근법을 사용하는 것 같습니다. – Liran

1

오브젝트가 논리적으로 변경 가능하지 않고 작성 비용이 다소 들지만 대체 할 수없는 자원과 적당하지 않은 양만 대체 할 수있는 것으로 알려진 경우; 이들에 대한 모든 참조를 추적하는 것이 비실용적이라면 짧은 약한 참조의 캐시를 사용하는 것이 좋습니다. 이러한 상황은 특정 시점에서 주어진 키와 일치하는 하나의 객체 만 "freachable"대기열 (정리를 필요로하는 객체의 목록) 외부에 존재할 것이기 때문에 최종 결정에 "의존"하는 것이 합리적이라고 생각할 수있는 몇 안되는 경우 중 하나 일 것입니다. . 이 접근법의 한 가지 장점은 최종화에 적합한 객체를 부활시키지 않으면 대부분의 경우 스레딩 문제에 대해 코드가 너무 걱정할 필요가 없다는 것입니다. 연관된 약한 참조가 죽은 주기적으로 정리 된 항목이어야하고, 캐시 항목이 죽은 것으로 인식 된 후에 캐시 항목이 새 객체로 업데이트 될 수 있음을주의해야하지만 GC는 해당 객체가 아무도 그들을 사용하는 동안 청소하지 마십시오.

관련 문제