ConcurrentMap < String, SomeObject > 개체가 있습니다. SomeObject 값이 있으면 반환하거나, SomeObject를 새로 만들고 Map에 넣고 존재하지 않으면 반환하는 메서드를 작성하려고합니다.필요한 경우에만 키를 추가 할 때 ConcurrentMap을 동기화해야합니까?
이상적으로 ConcurrentMap의 putIfAbsent(key, new SomeObject(key))
을 사용할 수는 있지만 매번 새로운 SomeObject (키)를 생성한다는 것은 매우 낭비적인 것 같습니다.
그래서 나는 다음과 같은 코드에 의존하지만,이 처리하는 가장 좋은 방법입니다 것을 확실하지 않다 : 나는 인 ConcurrentMap의 적 putIfAbsent (키, 새로운 SomeObject의 (키))를 사용할 수, 이상적으로
public SomeValue getSomevalue(String key){
SomeValue result = concurrentMap.get(key);
if (result != null)
return result;
synchronized(concurrentMap){
SomeValue result = concurrentMap.get(key);
if (result == null){
result = new SomeValue(key);
concurrentMap.put(key, result);
}
return result;
}
}
코드는 정확하지만 동기화 된 블록에 putIfAbsent를 사용할 수 있습니다. 더 최적이 될 것입니다. –
@GuillaumeF. 좀 더 최적의 의미를 설명해 주시겠습니까? 그 시점에서 나는 동기화 된 블록 내에서 그것을 검사하고 null 값을 얻었 기 때문에 키가 없다는 것을 안다. – isapir
나는 synchronized 블록 안에서 테스트를 제거하려고했다. 동기화되기 전에 이미 테스트를했기 때문에 두 번째 테스트가 null이 아닌 다른 결과를 반환 할 확률은 매우 낮습니다. 매우 드물게 실패 할 것이기 때문에 putIfAbsent를 객체의 새로운 인스턴스와 함께 사용하는 것이 더 최적 일 것입니다. 동기화 된 블록을 완전히 제거 할 수도 있습니다. –