# Thread Programmierung eine Lösung



## tomassio (1. Nov 2009)

Hallo

Bei folgenden Code kriege ich ein Deadlock. Wie kann ich den Deadlock vermeiden zuerst mit wait und notify, zweitens mit Semaphore.


```
class X {

	private X otherX;

	public void setPartner(X otherX) {
		this.otherX = otherX;
	}

	public synchronized void m1() {
		System.out.println("It's method m1");

			otherX.m2();
	}

	public synchronized void m2() {
		// OK
		System.out.println("It's method m2");
	}
}

public class UserofX extends Thread {
	private X myX;

	public UserofX(X x) {
		myX = x;
	}

	public void run() {
		for (int i = 0; i < 10000; i++)
				myX.m1();

	}
	

	public static void main(String[] args) {
		X x1 = new X();
		X x2 = new X();
		x1.setPartner(x2);
		x2.setPartner(x1);
		UserofX user1 = new UserofX(x1);
		user1.start();
		UserofX user2 = new UserofX(x2);
		user2.start();
	}
}
```

Gruss
Tomas

Noctarius: Bitte Java-Tags nutzen


----------



## SlaterB (2. Nov 2009)

klingt so nach Hausaufgaben (edit: also habe ich es hierher verschoben), auch wenn die Klassen nicht entsprechend benannt sind,
aber so ganz kurz gefragt ist etwas dürftig

was bedeuten denn wait und notify, schon irgendein Tutorial gelesen was dann auch zwangsläufig Beispiele enthält?
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11 Threads und nebenläufige Programmierung

wait/ notify brauchst du hier gar nicht mal, wenn beide Threads verschränkt auf verschiedene Objekte wait ausführen usw. gibts genauso einen Deadlock,
na jetzt verrate ich schon viel wenn es eine Hausaufgabe ist  ,
bitte überzeugend rückmelden, vielleicht mal paar eigene Sätze schreiben


----------



## tomassio (2. Nov 2009)

Besten Dank. Die main method darf nicht verändern und den DEADLOCK sollte mit wait und notify ablösen das ist die erste Problem und zweitens den DEADLOCK sollte mit Semaphore lösen.

Freundlichen Gruss
Tomas


----------



## SlaterB (2. Nov 2009)

nochmal ganz kurz:
wait/ notify ist allein eine Benachrichtung, wenn der eine fertig ist, dann anderen Bescheid sagen, die (auch) warten,
die z.B. bisher schon Zugriff hatten, aber nichts zu tun (Producer/ Consumer),
verwendet synchronized,

Semaphor ist quasi das allgemeine Konzept, wie sowas wie 'synchronized' implementiert ist, kann man sich auch selber bauen


beides kann aber nichts gegen Deadlocks tun wenn A und B verschiedene Ressourcen blockieren und dann auf den anderen warten,
da muss der Ablauf geändert werden, und dann gehts auch mit normalen synchronized, 
die Threads warten einfach bis die Methode frei ist, Benachrichtung per notify() ist nicht nötig,


----------



## tomassio (2. Nov 2009)

Danke schön. Bitte Quellcode anpassen für beide variante. Ich werde das schauen.

Gruss
Tomas


----------



## faetzminator (2. Nov 2009)

tomassio hat gesagt.:


> Danke schön. Bitte Quellcode anpassen für beide variante.



:noe:


----------

