2017-01-25 1 views
1

putIfAbsent를 사용하여 ConcurrentHashMap에 값을 추가합니다 (원자 작업으로 이미 존재하지 않는 경우).putIfAbsent가 ConcurrentHashMap을 수정했는지 여부를 알 수있는 올바른 방법은 무엇입니까?

모두 괜찮아 보이지만 실제로 새 오브젝트가 실제로 추가되었는지 여부를 알 수 있습니다.

내가 가진 가장 좋은 생각은 putIfAbsent의 반환 값이 null인지 확인하는 것입니다. 즉, null 값을 절대적으로 (ConcurrentHashMap이 허용하지 않는) 맵에 넣지 않는 한 오래 작동해야합니다. 내가 놓친 뭔가가 있는지 궁금해. 아니면 올바른 방법일까요?

+4

'putIfAbsent()'의 반환 값을 검사하는 것이 올바른 방법입니다. –

+0

@SeanBright 그래, 그 결론도 나왔다. 그러나 "return == null"은 조작이 뭔가를했는지 확인하는 이상한 방법으로 보였다. –

+0

관련 : [putIfAbsent를 사용하기 전에지도에 키가 포함되어 있는지 확인해야합니다] (http://stackoverflow.com/questions/3752194/should-you-check-if-the-map-containskey-before-using-concurrentmaps-putifabsent) –

답변

3

이 경우에 CHM을 사용하는 가장 좋은 방법은 같은 것입니다 : 당신만큼 당신이 할 수있는 비 차단 호출을 활용 할 수 있도록

Object o = concurrentMap.get(key); 

if(o == null){ 
    Object ret = concurrentMap.putIfAbsent(key, value); 
    if(ret == null){ 
     o = ret; 
    } 
} 
return o; 

get 호출 비 차단합니다. 계속적으로 putIfAbsent을 호출하면 많은 경우 호출 속도가 느려질 수 있습니다.

+1

'containsKey()'는 좀 더 읽기 쉽습니다. –

+0

그러나 목적을 이길 것입니다. 맵에 값이 있으면 그 값을 원하고'get()'은 원자 적으로 수행합니다. –

+0

질문을주의 깊게 읽으면 OP는 값이 있는지 확인하기 위해 반환 값을 묻지 않습니다. –

관련 문제