Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ein Monitor ist also etwas, das Threads sich nehmen können aber mit der Beschränkung, dass immer nur ein Thread einen konkreten Monitor haben kann. Wenn ein anderer Thread einen Monitor haben möchte, der bereits in Besitz eines anderen Threads ist, dann muss dieser warten, bis der andere Thread diesen freigegeben hat.
Was wie aufgerufen werden darf musst Du Dir überlegen. Was sind die Probleme, die es hier geben könnte? Du musst genau überlegen, denn die Herausforderung ist, dass unnötiges Locking vermieden werden soll.
Klar - du kannst alles Mögliche direkt auf dem RBTree blocken, aber ist das so wirklich notwendig?
Wenn ein Thread auf das zugreift darf in dem Moment ja kein anderer Thread auf contains zugreifen, weil dann kann es ja zu einem Fehler kommen. Das selbe doch bei contains und remove
Das würde ich nicht direkt mit ja beantworten. Ich habe keine Ahnung, was Du mit "was Synchronized sein soll" meinst. So Du damit nur die Möglichkeit meinst, dass Methoden synchronized gemacht werden, dann reicht dies nicht! Eine Methode synchronized zu machen würde immer bedeuten, dass das Monitor Objekt der Instanz verwendet wird. Es soll aber auch überlegt werden, welches Monitorobjekt man nutzt, daher wird das Monitorobjekt der Instanz vermutlich alleine nicht ausreichen.
Das würde ich nicht direkt mit ja beantworten. Ich habe keine Ahnung, was Du mit "was Synchronized sein soll" meinst. So Du damit nur die Möglichkeit meinst, dass Methoden synchronized gemacht werden, dann reicht dies nicht! Eine Methode synchronized zu machen würde immer bedeuten, dass das Monitor Objekt der Instanz verwendet wird. Es soll aber auch überlegt werden, welches Monitorobjekt man nutzt, daher wird das Monitorobjekt der Instanz vermutlich alleine nicht ausreichen.
Das würde ich nicht direkt mit ja beantworten. Ich habe keine Ahnung, was Du mit "was Synchronized sein soll" meinst. So Du damit nur die Möglichkeit meinst, dass Methoden synchronized gemacht werden, dann reicht dies nicht! Eine Methode synchronized zu machen würde immer bedeuten, dass das Monitor Objekt der Instanz verwendet wird. Es soll aber auch überlegt werden, welches Monitorobjekt man nutzt, daher wird das Monitorobjekt der Instanz vermutlich alleine nicht ausreichen.
public void doSomething() {
synchronized(this) { ... }
}
Wenn Du nun folgenden Code hast:
Java:
public synchronized doSomething1() { ... }
public synchronized doSomething2() { ... }
bedeutet dies, dass bei dem Aufruf einer der beiden Methoden auch jeweils die andere Methode mit gesperrt ist.
Wenn Du aber etwas hast wie:
Java:
private Object lock1 = new Object();
private Object lock2 = new Object();
public void doSomething1() {
synchronized(lock1) { ... }
}
public void doSomething2() {
synchronized(lock2) { ... }
}
hast Du nun nur jeweils die Methode blockiert, die aufgerufen wurde. Wenn ein Thread doSomething1 aufruft, dann kann ein anderer parallel doSomething2 aufrufen.
Und natürlich kann man mit den synchronized Statements auch nur Teile einer Methode blocken. Es kann also vor oder nach dem Block auch noch etwas kommen.
Und daher ist dann wirklich die Implementation im Detail zu betrachten und bei jedem Doing ist die Frage: Was passiert, wenn andere Threads irgend etwas anderes ausführen? Kann da etwas passieren? Beispiel: Ein Thread liest im Baum etwas. Gibt es irgend etwas an Code, das nicht parallel ausgeführt werden darf? Generell sollte es unkompliziert sein, wenn hunderte Threads lesend zugreifen. Aber evtl. gibt es ja etwas, das nicht funktioniert. Da ich die Implementierung nicht kenne, kann ich es nicht konkret sagen. Ich hatte damals nur einen "balanced search tree" und der rot/schwarz Suchbaum geht auch in diese Richtung: Es gibt gewisse "Drehoperationen" die dazu führen, dass der Baum immer ausbalanziert ist. Sowas kann kritisch sein: Du suchst ein Element und während du durchgehst wird dein aktueller Node "gedreht" und landet plötzlich tiefer und der gesuchte Knoten ist plötzlich der Parent oder auf der anderen Seite des Parents. Das müsste man also verhindern.
Ebenso das Löschen. Es wäre ja schade, wenn der Knoten, bei dem Du gerade bist, plötzlich aus dem Baum genommen wird oder so.
Und genau das ist, was Du Dir also im Detail überlegen musst.
Ja, das ist der große Unterschied. Und das ist sinnvoll, wenn doSomething1 und doSomething2 gleichzeitig ablaufen dürfen.
doSomething1: Zug auf Gleis 1
doSomething2: Zug auf Gleis 2
Es dürfen Züge auf Gleis 1 und auch auf Gleis 2 einfahren. Aber man wird nicht wollen, dass zwei Züge auf Gleis 1 einfahren. Der zweite Zug soll bitte warten, bis der erste Zug das Gleis wieder freigegeben hat.
Wieso ist das wichtig? Du wirst dann ja bestimmt irgendwas problematisches sehen. Du musst also Argumente bringen, wieso Du da sozusagen das Gleis 1 sperren willst. Da ist das Argument einfach: Wenn ein zweiter Zug in das Gleis 1 einfahren kann, dann kann er auf den dort ggf. noch stehenden Zug prallen. Das will man nicht.
Aber wenn du den ganzen Bahnhof sperren willst, dann wird man Dir einen Vogel zeigen. Natürlich kann der ICE auf dem Gleis ohne Bahnsteig durchfahren, auch wenn da an einem Bahnsteig an Zug steht. Und das wird es sogar sollen, denn der Zug warten ggf. darauf, dass der ICE endlich vorbei fährt, da der ICE schneller fährt und Vorrang hat und die Strecke hinter dem Bahnhof halt nur ein Gleis in diese Richtung hat.
Ja ich verstehe worauf du hinaus willst wenn ich im selben Baum die Zahl 1 einfügen und aber auch direkt wieder lösche ist das ein Fehler wenn ich aber in Baum 1 die Zahl 1 hinzufüge und im Baum 2 die Zahl 1 lösche ist das nicht problematisch