Threads

KonradN

Super-Moderator
Mitarbeiter
Evtl. hilft dies weiter:

Oder wie immer die JLS:

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.
 

KonradN

Super-Moderator
Mitarbeiter
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?
 

Mariexshhx

Bekanntes Mitglied
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
 

KonradN

Super-Moderator
Mitarbeiter
Mit unnötige locks vermeiden ist gemeint, dass man genau überlegen soll, was Synchronized sein soll oder ?
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.
 

Mariexshhx

Bekanntes Mitglied
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.
Ich dachte das wäre mit unnötige locks vermeiden gemeint
 

Mariexshhx

Bekanntes Mitglied
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.
Dem würde ich entnehmen, dass man hier ggf. unterschiedliche Monitor Objekte verwenden sollte.
 

KonradN

Super-Moderator
Mitarbeiter
Es gibt mehrere Möglichkeiten, etwas zu synchronisieren:
1. synchronized Methoden: https://docs.oracle.com/javase/specs/jls/se18/html/jls-8.html#jls-8.4.3.6
2. synchrionized Statement: https://docs.oracle.com/javase/specs/jls/se18/html/jls-14.html#jls-14.19

Das wird auch noch etwas in Kapitel 17 beschrieben, in dem generell auf Threads und Locks eingegangen wird: https://docs.oracle.com/javase/specs/jls/se18/html/jls-17.html#jls-17.1

Wenn Du nach 1 Vorgehst, dann hast Du sowas:
Java:
public synchronized void doSomething() { ... }

Das entspricht einem:
Java:
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.
 

Mariexshhx

Bekanntes Mitglied
private Object lock1 = new Object();
private Object lock2 = new Object();

public void doSomething1() {
synchronized(lock1) { ... }
}

public void doSomething2() {
synchronized(lock2) { ... }
}

Kann man hier doch die Methoden parallel aufrufen, weil man zwei verschiedene Objekte hat ? Und in welchem Fall wäre das sinnvoll ?
 

KonradN

Super-Moderator
Mitarbeiter
Kann man hier doch die Methoden parallel aufrufen, weil man zwei verschiedene Objekte hat ? Und in welchem Fall wäre das sinnvoll ?
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.

Bei meinem Baum wäre es ja wichtig zu locken wenn auf ein und den selben Baum
Zugegriffen wird
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.

Du verstehst, woraus ich hinaus will?
 

Mariexshhx

Bekanntes Mitglied
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
 

KonradN

Super-Moderator
Mitarbeiter
Es geht nicht um das arbeiten in unterschiedlichen Bäumen. Es geht um einen Baum.

Aber denn Du einen Suchbaum hast mit Elementen:

Code:
     4
 2       6
1 3     5 7

Wo ist das Problem, wenn ein Thread nach der 1 sucht und ein anderer Thread nach der 7?

Wo ist das Problem, wenn ein Thread nach der 1 sucht und ein anderer Thread die 8 einfügt?

Wo ist das Problem, wenn ein Thread nach der 1 sucht und ein anderer die 7 entfernen will?

Das einfach nur einmal als ein paar kleine Beispiele / Fragen, auf die Du vielleicht ein paar Antworten finden könntest.
 

Mariexshhx

Bekanntes Mitglied
Der Baum verschiebt sich ja beim einfügen/ löschen und dann klappt es mit dem suchen nicht

Aber ist es nicht auch ein Fehler wenn es um die selbe Zahl geht also wenn ein Thread die 7 Einfügt und ein anderer die 7 entfernt ?
 

KonradN

Super-Moderator
Mitarbeiter
Was genau verschiebt sich wann und was ist davon wie betroffen?

Was macht denn der Code zum löschen eines Nodes genau? Was sind die Schritte?

Du musst bei sowas ganz genau und exakt sein! So pauschale Aussagen reichen in keiner Weise!
 

Neue Themen


Oben