2017-01-25 4 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を使用するための最良の方法などさ:get呼び出しは、ノンブロッキングなので、あなたはできる限り非ブロッキング呼び出しを活用したい

Object o = concurrentMap.get(key); 

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

。継続的にputIfAbsentを呼び出すと、多くの場合、パフォーマンスが低下する可能性があります。

+1

'containsKey()'は少し読みやすくなります。 –

+0

しかし、目的を破るだろう。マップに値が存在する場合はその値を必要とし、 'get()'はそれを原子的に行います。 –

+0

質問を注意深く読んだ場合、OPは戻り値を要求せず、値があるかどうかだけを確認します。 –

関連する問題