Thread Programmierung eine Lösung

Status
Nicht offen für weitere Antworten.

tomassio

Mitglied
Hallo

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

Java:
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 :)
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

tomassio

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

SlaterB

Gast
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,
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben