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.
Beispiel: Code mit synchronized
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!
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: