2017-11-14 6 views
0

우리는 here으로 묘사 된 spring-cloud-netflix-core 라이브러리를 사용하는 상황이 있습니다. 문제는 CachingSpringLoadBalancerFactoryConcurrentReferenceHashMap이고 here이보고 된 것과 같습니다.
또한 (소프트 참조를 사용) ConcurrentReferenceHashMap의 문서에서 :ConcurrentReferenceHashMap은 어떻게 작동합니까?

참조의 사용은 맵에 배치 항목을 연속적으로 사용할 수 있습니다 보장이 없다는 것을 의미한다. 가비지 컬렉터는 언제든지 참조를 삭제할 수 있으므로 알 수없는 스레드가 자동으로 항목을 제거하는 것처럼 보일 수 있습니다.

내 질문은 다음과 같습니다.
1. 다음 사항에 대한 올바른 이해가 있습니까?

// Original code is in CachingSpringLoadBalancerFactory in spring-cloud-netflix-core 
// cache is a field of type ConcurrentReferenceHashMap 
if (this.cache.containsKey(clientName)) { 
    return this.cache.get(clientName); // This can be null, right? 
} 

2. 그것에 대한 테스트 케이스를 작성 어쨌든입니다. 제한된 메모리 (-Xmx50m)를 사용하는 독립 실행 형 응용 프로그램에서 한 번 재생했습니다. 그런 시나리오를 다루기 위해 어떻게 단위 테스트를 작성할 수 있습니까?

답변

0

네 질문에 맞습니다. 맞습니다. 일반적으로 문서에 명시된 바와 같이 WeakHashMap의 변형입니다.

WeakHashMap를위한 JavaDoc 말한다 :.

"는 WeakHashMap 클래스의 행동 때문에, 잘 알고 그래서 몇 가지 필수가 아닙니다만 Map 불변이 클래스에 대한지지 않은 가비지 컬렉터의 행동에 부분적으로 의존 가비지 컬렉터는 언제라도 키를 파기 할 수 있습니다. WeakHashMap는 알 수없는 스레드가 자동으로 항목을 제거하는 것처럼 동작 할 수 있습니다. 특히 WeakHashMap 인스턴스에서 동기화하고 해당 mutator 메서드를 호출하지 않는 경우 size 메서드 isEmpty 메서드가 false을 반환하고 그 다음을 반환하기 위해 시간이 경과함에 따라 더 작은 값을 반환하려면 get 방법 null 복귀하도록 put 방법 및 위해 false 복귀하도록 remove 방법에 대해, 소정의 키 값을 반환하지만 나중에 null를 반환 할 2,238,상기 containsKey 방법에 대해, 주어진 키 true 이상 false을 반환 이전에 맵에 등장한 키와 키 세트, 값 콜렉션 및 연속적으로 더 적은 수의 요소를 산출하는 엔트리 세트를 연속적으로 검사하기 위해 사용되었습니다. "

이 문제로 인해 테스트하기가 어렵습니다. 맵의 getReference() 메소드와 해당 요소의 release() 메소드를 사용하여 일부 불변성을 테스트하려는 경우 제거를 시뮬레이트 할 수 있습니다.