Threads und synchronized

OnDemand

Top Contributor
Hallo zusammen,

ich habe eine seltsame Aufgabe. :toll:

In einer Klasse
Java:
public class MeineKlasse {
//
}

soll irgendeine Methode implementiert werden, die Funktion ist Wurscht, hauptsache die ist sychonisiert.

Meine Idee:
Java:
public synchronized void macheMal(){
//code
}

ausserdem soll eine "kleinkörnige -threadsichere Blockstruktur eingefügt werden, dies in einer weiteren sinnlosen Methode.
Meine Idee:

Java:
MeineKlasse iwas = new MeineKlasse();

public void macheMalDieZweite(){
// Thread-sicherer Programmblock
		synchronized (iwas) {
			//hier wird jetzt was mit dem Objekt iwas aus der Klasse "MeineKlasse" angestellt
		}

Wie sieht nun die Klassendeklaration aus, wenn die Thread-sichere Methode UND der Thread-sichere Programmblock den Monitor des Objekts der Klasse "MeineKlasse" verwenden?

Und ich so: hä?

Die KLassendeklaration müsste doch dann lauten:
Java:
public class MeineKlasse extends Thread

denn dann verwenden die Threads den selben Monitor der Klasse "MeineKlasse" oder?
Ich hoffe mir kann jemand folgen, auch wenn ich es selbst nicht mehr kann^^
 
Wie sieht nun die Klassendeklaration aus, wenn die Thread-sichere Methode UND der Thread-sichere Programmblock den Monitor des Objekts der Klasse "MeineKlasse" verwenden?

Du könntest schreiben:

Java:
synchronized ( this ) {
    ....
}

Die Member iwas ist dann nicht erforderlich.
 
Zuletzt bearbeitet:
HI Barista,

danke, mit this ist klar, aber das ist doch nicht die Klassendeklaration?! Die Frage ist ja, wie sieht die Klassendeklaration aus, wenn ...
 
Er muss es sogar so schreiben. Dein Objekt "iwas" ist eine andere Instanz der Klasse, deshalb wären das zwei unterschiedliche Monitore und die beiden synchronized-Blöcke wären nie auf den gleichen Monitor bezogen. Ein Monitor bezieht sich immer auf eine Instanz, nicht auf die dahinterstehende Klasse.

Edit: Mit Klassendeklaration ist vermutlich der gesamte Code der Klasse gemeint, nicht nur die Signatur.
 
Zuletzt bearbeitet:
Ah ok. Aber die Klassendeklaration, wie lautet die nun 😀

Java:
public class MeineKlasse {
oder
Java:
public class MeineKlasse extends Thread{
oder jemand einen anderen Vorschlag?

Oder meinst du die Frage ist so gemeint: "Wie sieht die ganze Klasse aus bzw. schreiben Sie die gesamte Klasse auf, wenn thred-sicherer Block und Methhode auf das Objekt der Klasse zugreifen"

Hab ich einfach nur die Frage falsch verstanden?
 
Zuletzt bearbeitet:
Hmm ich glaube ich hab tatsache die Frage falsch verstanden. Die wollen bestimmt, dass ich die ganze Klasse schreibe, denn wenn sie wissen wollen, ob extends Thread oder sonst was, würden sie nach der Klassendeklaration fragen, nicht nach der Klassendefinition.

Stimmt mir jemand zu?

Meine Klasse sieht dann wie folgt aus:
Darin mein synchonisierter Block+Methode, welche beide auf den selben Monitor zuzgreifen, nämlich den der KLasse Irgendwas
Java:
public class Irgendwas {

	public synchronized void machMal() {

		System.out.println("machMAl erfolgreich aufgerufen");

	}

	public void macheNicht() {
		synchronized (this) {
			System.out.println("macheNicht aufgerufen");

		}
	}
}
 
Java unterscheidet im Gegensatz zu z.B. C++ nicht zwischen Klassendefinition und Klassendeklaration. In C++ gehören zur Klassendeklaration die Signaturen aller Methoden, deren Code allerdings nicht. Da es diese Trennung in Java nicht gibt, wurde der Begriff bei der Fragestellung vermutlich etwas schwammig benutzt.

Dein Code ist korrekt und erfüllt meines Erachtens die Fragestellung. Deine Erklärung ist allerdings nicht ganz richtig - sie verwenden nicht den Monitor der Klasse, sondern den der aktiven Instanz, d.h. this. Die Klasse hat auch einen Monitor, nämlich den Wert von Irgendwas.class - dieser wird implizit verwendet, wenn man synchronized bei static-Methoden einsetzt, denn dort gibt es kein this.
 

Zurück
Oben