Race conditions

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Race conditions
Kann mir jemand erklären, wie können race conditions zwischen Methoden auftreten, wenn die Methoden selbst synchronized sind.
Zb in der Vorlesung hatten wir Beispiel:

if(!vector.contains(ele))
vector.add(ele)

vector ist synchronized.


Du prüfst zunächst, ob das Element bereits enthalten ist und stellst fest, dass es nicht so ist. Danach fügst du es hinzu. Dazwischen kann die Ausführung unterbrochen werden.

Zwischen dem Prüfen und dem Hinzufügen könnte also bereits ein anderer Thread dieses Element hinzugefügt haben und damit wird es nun ein zweites mal eingefügt.


Jetzt ist es klar :slight_smile: Danke Raim
Die nächste Frage ist: wie vermeidet man sowas?


Am besten natürlich wäre es, wenn der Datentyp gleich so implementiert wurde, dass es sich vermeiden lässt.

/**
 * ...
 * @return true wenn neu hinzugefügt, false wenn bereits enthalten
 */
bool add(...) {
  ...
}

Geht natürlich nur, wenn das immer das gewünschte Verhalten ist. Wie z.B. bei einem Set.

Ansonsten müsstest du den Check und das Hinzufügen atomar machen. Wie das in Java geht weiß ich nicht wirklich, vermutlich [m]synchronized {}[/m] drumrum oder so was.


alles klar. danke nochmals :slight_smile: