2012-08-13 2 views
0

String 값을 보유하고 이미 존재하지 않는 요소를 추가하는 메소드를 동기화 한 Java 컬렉션이 필요합니다 (addIfAbsent은 ArrayList 용입니다). 수집량이 많은 트래픽이 발생합니다. 또한 컬렉션에서 항목이 만료 된 후 일부 시간 초과 메커니즘을 갖고 싶습니다. 제한 시간은 약 5 초 여야합니다.시간 초과가있는 자바 동시 설정

우아한 해결책에 대한 제안이 있으십니까? 타임 아웃 메커니즘이없는 컬렉션을 선택하는 것도 도움이 될 것입니다.

도움 주셔서 감사합니다.

답변

2

컬렉션에 삽입 된 항목이 제거되기까지의 시간 값으로 시간 제한을 해석하면 Guava Cache implementation이 적합 할 수 있습니까? putIfAbsent 메서드를 직접 노출하지는 않지만 CacheLoader을 사용하거나 Callable을 제공하여 필요한 경우 값을 생성 할 수 있습니다.

String value = cache.get("key", new Callable<String>() { ... }); 

cache 지정된 key에 대한 값을 포함하지 않은 경우 호출 호출 할 것이다.

+0

구아바 캐시 나를 위해 트릭을 할 것 인 무엇인가 같습니다

,이 스레드에서 봐 주시기 바랍니다. 내가 질문하지 않은 한 가지는'cache.get (...) '을 호출 할 때 키가 이미 캐시에 존재했는지를 알아야한다는 것입니다. 정확히 말하면 캐시에있는 키의 이전 존재에 대한 반환 정보가 있으면 원자 놔두 기가 필요합니다. 내가 찾은 유일한 해결책은 캐시를지도로 사용하는 것입니다 : 'value = cache.asMap(). putIfAbsent (key, value)' 그런 식으로 저는 Guava 자체 로딩 작업을 잃어 버렸지 만, 타임 아웃 메커니즘을 사용합니다. 그것에 대해 어떻게 생각하세요? – njosa

+0

@njosa : 정보가 필요하다면 "전에 삽입 했었지만 전에는 없었습니다"라고 말하면 다른 선택의 여지가 없을 것입니다. 나중에 값이 요구되었을 때 그 값이 실제로 맵에 있는지 확인하고 싶다면'cache.get (String, Callable) '메소드가 더 좋다. 'Callable' 함수가 호출되어 요청시와 없을 때 값을 생성합니다. 따라서 발신자에게는 투명합니다. 항목이 현재 존재하는지 여부에 대한 정보가 필요하다면'getIfPresent()'가 도움이 될 수 있습니다. – Stephan

3

어떤 형태의 캐싱 메커니즘을 구현하려고합니까? 그렇다면 바퀴를 재발 명할 필요가 없습니다. EhCache와 같은 일부 캐시 구현을 사용할 수 있습니다. similar question about collections with timeout (caches)

+0

도와 주셔서 감사합니다. 실은 저에게 정말로 필요한 것을 이해하는 데 정말로 도움이되었습니다. – njosa