Warum ConcurrentHashMap.putifAbsent sicher ist?
Habe ich gelesen, für concurency seit gestern und ich weiß nicht viel Sachen... Aber einige Dinge beginnen zu bekommen, klar,...
Ich verstehe, warum double-check-locking nicht sicher (ich Frage mich, was ist die propability der seltene Zustand zu kommen) aber flüchtigen behebt das Problem in 1.5 +....
Aber ich Frage mich, ob dies geschieht mit putifAbsent
wie...
myObj = new myObject("CodeMonkey");
cHashM.putIfAbsent("keyy",myObj);
Dann tut dies sorgt dafür, dass myObj
wäre 100% intialiased, wenn ein anderer thread hat ein cHashM.get()
??? Da könnte es eine Referenz ist nicht vollständig initialisiert (die double-check-lock-problem)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rufen Sie
concurrentHashMap.get(key)
und es gibt ein Objekt, dieses Objekt ist garantiert vollständig initialisiert ist. Jeder put (oder putIfAbsent) erhalten einen Eimer spezifische lock-und append-element, um den Eimer Einträge.Nun können Sie durch den code gehen und beachten Sie, dass die get-Methode nicht erhalten, diese gleich zu sperren. So kann man argumentieren, dass es eine out-of-date Lesen, das ist nicht wahr. Der Grund hier ist, dass der Wert im Eintrag selbst ist flüchtig. So können Sie sicher sein, Holen Sie die meisten up-to-date gelesen.
putIfAbsent
Methode inConcurrentHashMap
ist, prüfen-wenn nicht vorhanden-dann-Satz-Methode. Es ist eine Atomare operation. Aber die Antwort auf die folgenden Artikel: "Dann tut dies sorgt dafür, dass myObj wäre 100% intialiased, wenn ein anderer thread hat ein cHashM.get() ", es würde davon abhängen, wenn das Objekt in die HashMap. In der Regel es ist passiert-vor Vorrang, D. H., wenn der Anrufer bekommt den ersten, bevor das Objekt ist platziert in der Karte, dannnull
würde zurückgegeben werden, sonst wäre der Wert zurückgegeben.Den entsprechenden Teil der Dokumentation ist diese:
--
java.util.ConcurrentMap
So, ja, Sie haben Ihre passiert-vor Beziehung.
Ich bin kein Experte auf diesem, aber mit Blick auf die Umsetzung der
Segment
imConcurrentHashMap
ich sehe, dass dievolatile
Feldcount
scheint verwendet werden, um sicherzustellen, dass die ordnungsgemäße Sichtbarkeit zwischen threads. Alle lese-Operationen Lesen Sie diecount
Feld und schreiben Sie alle Vorgänge haben, zu schreiben. Aus den Kommentaren in der Klasse: