Hallo Leute,
ich habe ein Operation die noch nicht atomar ist und möchte dabei gerne auf Locks verzichten. Es geht um eine Map die Collections als Value hält. Wenn eine Collection leer ist, soll die Methode den entsprechenden Eintrag aus der Map entfernen. Das Problem dabei ist, dass zwischen der Prüfung von isEmpty() und dem Aufruf von remove() ein anderer Thread etwas zu der Collection adden könnte. Dadurch würden die gerade hinzugefügten Elemente einfach verloren gehen...
Ist es möglich, dass ohne Locks (syncronized), mit Atomics zu lösen? Wahrscheinlich ist das nicht möglich, weil es sich um zwei verschiedene Collections handelt oder?
Danke schonmal.
Gruß Nova
ich habe ein Operation die noch nicht atomar ist und möchte dabei gerne auf Locks verzichten. Es geht um eine Map die Collections als Value hält. Wenn eine Collection leer ist, soll die Methode den entsprechenden Eintrag aus der Map entfernen. Das Problem dabei ist, dass zwischen der Prüfung von isEmpty() und dem Aufruf von remove() ein anderer Thread etwas zu der Collection adden könnte. Dadurch würden die gerade hinzugefügten Elemente einfach verloren gehen...
Java:
private void removeOnEmpty(Map<String, Collection> aMap, String aKey) {
Collection theObjects = aMap.get(aKey);
//NICHT ATOMAR
if(theObjects.isEmpty()) {
aMap.remove(aKey);
}
//NICHT ATOMAR ENDE
}
Ist es möglich, dass ohne Locks (syncronized), mit Atomics zu lösen? Wahrscheinlich ist das nicht möglich, weil es sich um zwei verschiedene Collections handelt oder?
Danke schonmal.
Gruß Nova