# Thread Synchronisation



## Klaus223564 (9. Sep 2010)

Hallo zusammen,
habe mal eine Frage zum Thema Thread und Synchronisation.

Ich habe eine Klasse Auto mit einer Objektmethode "fahren". Von dieser Klasse habe ich 10 Objekte erstellt.
Im Programm laufen 3 verschiedene Threads. Jeder Thread ruft unterschliedlich irgendwann die Methode "fahren" auf.

Mein Problem ist, dass es passieren kann das die 3 Threads 3 Autos auf einmal fahren lassen können. Ich möchte allerdings, dass wenn ein Auto von den 10 fährt, die anderen warten müssen, bis das fahrende Auto wieder steht. Danach kann der nächste Thread weitermachen. Synchronisieren reicht allein ja nicht aus, weil es eine Objekt-Methode ist.

Kann man dies lösen?

Übrigens das Beispiel habe ich vereinfacht so geschrieben, in Wirklichkeit geht es um DB-Zugriff und Datenabgleich, deshalb darf nur ein Objekt maximal an der DB arbeiten.

Danke schonmal


----------



## Tomate_Salat (9. Sep 2010)

ja, mit bussy waiting z.B. schau mal auf youtube, da hat hdi ein schönes videoprojekt am laufen. Suche dort einfach nach: "Vom Noob zum SCJP"

MFG

Tomate_Salat


----------



## Marco13 (9. Sep 2010)

busy waiting? Ähm... schau dir lieber mal solche Sachen wie Semaphore (Java Platform SE 6) an...


----------



## Tomate_Salat (9. Sep 2010)

dachte mir dasses da besseres gibt ^^. Habe bisher eher wenig in die Richtung gemacht.

*edit* Insel8 - Semaphor ergänze ich mal zu deinem link


----------



## Murray (9. Sep 2010)

Klaus223564 hat gesagt.:


> Synchronisieren reicht allein ja nicht aus, weil es eine Objekt-Methode ist.


Das allein wäre ja kein Hinderungsgrund; man kann in der Methode ja auf ein statisches Objekt synchronisieren:

```
static final Object sync = new Object();


public void fahren() {
  synchronized( sync) {
     // ...
  }
}
```

Damit wäre gewährleistet, dass immer nur ein Thread den "synchronized"-Block in irgendeiner Instanz erreichen kann.

(Womit ich Dich aber nicht davon abhalten  will, Semaphore zu verwenden.)


----------



## dark_xray (10. Sep 2010)

Murray hat gesagt.:


> ...
> 
> ```
> static final Object sync = new Object();
> ...



Wäre für sowas nicht eher ein Mutex einzusetzen?


----------



## Murray (10. Sep 2010)

Nach dieser Definition  ist das doch sogar ein Mutex. Man könnte natürlich schreiben:

```
static final Object mutex = new Object();


public void fahren() {
  synchronized( mutex) {
     // ...
  }
}...
```

Aber wie schon geschrieben: es spricht nichts dagegen, Semaphore zu verwenden. Ich wollte nur der Aussage widersprechen, dass man mit einfacher Synchronisierung in diesem Fall nichts erreichen kann.


----------



## dark_xray (10. Sep 2010)

Murray hat gesagt.:


> Nach dieser Definition  ist das doch sogar ein Mutex. Man könnte natürlich schreiben:
> 
> ```
> static final Object mutex = new Object();
> ...



Mal wieder was gelernt, habe jetzt eher an den Lock gedacht, aber ist ja im endeffekt auch das gleiche


----------



## FArt (10. Sep 2010)

> Übrigens das Beispiel habe ich vereinfacht so geschrieben, in Wirklichkeit geht es um DB-Zugriff und Datenabgleich, deshalb darf nur ein Objekt maximal an der DB arbeiten.


Gott sei dank hast du es nicht so kompliziert gemacht. Bei DB hätte sicher jeder hier erschrocken die Flucht ergriffen. Bei Autos aber können wir gerade noch mitdenken.

Verwende Queues und/oder ExecutorService oder allgemein: bediene dich aus dem Package java.util.concurrent


----------

