6

Aus dem Javadoc weiß ich ConcurrentHashMap.replace ist Atom, aber was ist mit ConcurrentHashMap.put? Ich sehe, dass sie im Quellcode unterschiedlich implementiert sind, aber ich bin nicht in der Lage, ihre Unterschiede herauszufinden. Irgendwelche Gurus, um einige Richtlinien zu geben, wie man diese zwei Methoden benutzt?GleichzeitigeHashMap.put V.S. ConcurrentHashMap.replace

Antwort

11

Sie sind funktionell unterschiedlich. replace speichert das Schlüssel/Wert-Paar nur dann, wenn bereits ein Wert unter dem angegebenen Schlüssel gespeichert wurde. Die API-Dokumentation von replace erklärt es:

Ersetzt den Eintrag für einen Schlüssel nur, wenn derzeit auf einen Wert zugeordnet ist. Dies entspricht

mit der Ausnahme, dass die Aktion atomar ausgeführt wird.

+5

+1 Und beide Operationen sind atomar. –

+0

Ich hätte den Javadoc besser lesen sollen ... Danke! –

2

put() ist aus der Klasse geerbt AbstractMap die ConcurrentHashMap erstreckt. Kein besonderer Nebenvertrag ist unter put(). Diese Vererbung ermöglicht die Verwendung von ConcurrentHashMap in einem "traditionellen" Kontext einer Map. Aber keine AbstractMap Methode ist atomar.

replace() ist implementiert wie von der ConcurrentMap Schnittstelle angefordert. Diese Schnittstelle erfordert atomare Operationen wie replace(). Nur Methoden dieser Schnittstelle sollen in einem gleichzeitig erkennbaren Code verwendet werden.

Um eine atomare put() Operation zu verwenden, verwenden Sie putIfAbsent() von der gleichen ConcurrentMap Schnittstelle.

0

auf dem Code von PUT Blick in ConcurrentHashMap, hat die Umsetzung Atom Verhalten hinzugefügt, und Java docs sagen:

Blockquote Diese Klasse umfasst die gleiche funktionale Spezifikation wie Hashtable gehorcht und enthält Versionen von Methoden entsprechend jeder Methode von Hashtable.

Wie ich verstehe, sollte es sicher sein, Put-Methode in einer ConcurrentHashMap zu verwenden.