# Threads



## Mariexshhx (28. Mai 2022)

Was ist mit Monitor Objekten gemeint ?


----------



## mihe7 (28. Mai 2022)

Vermutlich die Objekte, deren Monitore zur Thread-Synchronisation verwendet werden.


----------



## Mariexshhx (28. Mai 2022)

*Was genau ist mit einem Monitor gemeint ?*


----------



## KonradN (28. Mai 2022)

Evtl. hilft dies weiter:


			Java threads
		


Oder wie immer die JLS:


			Chapter 17. Threads and Locks
		


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.


----------



## Mariexshhx (28. Mai 2022)

Also in diesem Fall darf ja nicht einfügen und Contains gleichzeitig ausgeführt werden liege ich da richtig ?


----------



## Mariexshhx (28. Mai 2022)

Genauso wie contains und Remove immer hintereinander ausgeführt werden muss oder ?


----------



## KonradN (28. Mai 2022)

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 (28. Mai 2022)

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


----------



## Mariexshhx (28. Mai 2022)

Mit unnötige locks vermeiden ist gemeint, dass man genau überlegen soll, was Synchronized sein soll oder ?


----------



## mihe7 (28. Mai 2022)

Ja.


----------



## KonradN (28. Mai 2022)

Mariexshhx hat gesagt.:


> 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 (28. Mai 2022)

Kann mir irgendwer nen Tipp geben ?


----------



## Mariexshhx (28. Mai 2022)

KonradN hat gesagt.:


> 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


----------



## KonradN (28. Mai 2022)

> Welche Methoden müssen wir auf welchen Monitor-Objekten synchronisieren, ...


Dem würde ich entnehmen, dass man hier ggf. unterschiedliche Monitor Objekte verwenden sollte.


----------



## Mariexshhx (28. Mai 2022)

KonradN hat gesagt.:


> 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.





KonradN hat gesagt.:


> Dem würde ich entnehmen, dass man hier ggf. unterschiedliche Monitor Objekte verwenden sollte.


----------



## Mariexshhx (28. Mai 2022)

was ist denn mit unterschiedlichen gemeint ?


----------



## Mariexshhx (28. Mai 2022)

Ich meine die Methoden greifen ja auf Objekte zu


----------



## Mariexshhx (28. Mai 2022)

Contains sollte ja nicht auf das Objekt zugreifen können, was gerade von der and Methode hinzugefügt wird


----------



## KonradN (28. Mai 2022)

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:

```
public synchronized void doSomething() { ... }
```

Das entspricht einem:

```
public void doSomething() {
    synchronized(this) { ... }
}
```

Wenn Du nun folgenden Code hast:

```
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:

```
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 (28. Mai 2022)

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 ?


----------



## Mariexshhx (28. Mai 2022)

Bei meinem Baum wäre es ja wichtig zu locken wenn auf ein und den selben Baum 
Zugegriffen wird


----------



## KonradN (28. Mai 2022)

Mariexshhx hat gesagt.:


> 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.



Mariexshhx hat gesagt.:


> 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 (28. Mai 2022)

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 (28. Mai 2022)

Es geht nicht um das arbeiten in unterschiedlichen Bäumen. Es geht um einen Baum.

Aber denn Du einen Suchbaum hast mit Elementen:


```
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 (28. Mai 2022)

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 (28. Mai 2022)

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!


----------



## Mariexshhx (28. Mai 2022)

Ah okay 
Vielen dank für die Hilfe !!


----------

