ReentrantLock oder Synchronized ?

derfreak

Mitglied
Hallo,

ich bin gerade beim Thema Threads und versuche nun Synchronized & ReentrantLock zu verstehen.
"Eigentlich habe ich, dass ganze so in etwa verstanden..."

Soweit ich es im Buch " Java ist auch nur eine Insel "verstanden habe, ist synchronized veraltet weshalb man deswegen auf ReentrantLock zurück greift.
Ich finde jedoch irgendwie Mühsam den kritischen Abschnitt zu suchen und dann fest zulegen.

F: Gibt es eine eine Methode um den Kritischen Abschnitt zu finden, auch dann wenn es fremder Code ist, beispielsweise in Klausuren?

Einfacher hingegen finde ich es, wenn ich einfach komplett alles in eine neue Methode Packe (z.b. wenn vorher alles in der void run() Methode war) und die neue Methode mit synchronized benennen.
Gleicher Effekt, soweit ich es getestet habe.

Beispiel: Code mit Lock.
Java:
class P1 extends Thread {

	public void run() {

		int x = (int) (Math.random() * 300) + 1;
		int y = x;

		for (int i = 0; i < 20; i++) {

			Main.lock.lock();
			// Kritischer Abschnitt:
			Main.p.x = x;
			Main.p.y = y;
			int xc = Main.p.x, yc = Main.p.y;
			Main.lock.unlock();

			if (xc != yc)

				System.out.println("Aha: x=" + xc + ", y=" + yc);
		}

	}

Beispiel: Code mit synchronized

Java:
class P1 extends Thread {

	public void run() {

		zaehler();

	}

	public static synchronized void zaehler() {
		int x = (int) (Math.random() * 300) + 1;
		int y = x;

		while (true) {
			Main.p.x = x;
			Main.p.y = y; 

			int xc = Main.p.x, yc = Main.p.y;

			if (xc != yc)

				System.out.println("Aha: x=" + xc + ", y=" + yc);
		}
	}

}



F: Meine Frage ist halt, was sollte man nun verwenden?
F: Gibt es da Regeln, wo man was benutzt?

Edit: Ich habe gerade gesehen, dass wenn ich bei der Methode zaehler(), static weg lasse, dass ganze nicht mehr funktioniert. Also xc NICHT gleich yc ist... weiß jemand vielleicht warum?



Vielen Dank!
 
Zuletzt bearbeitet:
Ja, liegt am nebenläufigen Garbage Collector

Achso Danke! 🙂

Wie siehts mit den anderen Fragen aus, weißt du da auch mehr?

F: Was genau versteht man unter Monitor?
Bedeutet, dass nicht einfach, dass es eine Klasse ist die synchronisiert? Also wo jeder Thread nicht durch Schreibkonflikte von anderen Threads behindert wird, indem man es synchronisiert?
 
Zuletzt bearbeitet:
hi,
wenn du dich intensiver damit beschäftigst, mit der ganzen sichtbarkeitssache und so weiter, dann kann ich dir nur das buch "Java Core Programmierung" empfehlen.
javampir
 

Zurück
Oben