Hallo,
habe zwei Fragen zu einem Code.
1. Warum werden nicht nur ungerade Zahlen ausgegeben?
2. Der Quellcode soll so Synchronisiert werden das nur ungerade Zahlen ausgegeben werden ohne eine weiter Variabele oder die main Methode zu ändern.
Zu 1. Es werden deswegen nicht nur ungerade Zahlen ausgegeben weil die Threads um das Objekt counter konkurrieren. Sie greifen alle auf das Objekt zu und verändern es. Somit ist immer unklar welcher Wert in counter steckt. Dazu kommt das System.out.println gepuffert wird und man nicht genau sagen kann wann die Ausgabe erfolgt und wann eben das Objekt erneut geändert wurde.
Kann man das verstehen und wäre das ansatzweise Korrekt?
Zu 2.
Hier bin ich gescheitert und glaube das ich synchronized nicht verstehe :-(
Das war meine Idee. Leider ohne Erfolg. Bin davon ausgegangen das synchronized für das Objekt Counter mit der instanz 0 z. B. dann blockiert und erst diese instanz fertig laufen darf. Das scheint wohl nicht so zu sein oder? Das wäre jedoch sehr merkwürdig da man dann ja nie eine Klasse die Synchronisiert ist mit mehreren instanzen synchron laufen lassen dürft! Deswegen muss meine Annahme wohl falsch sein. Wo dann der Fehler steckt weiß ich nicht. Der aller erste Ansatz war die increment Methode mit synchronized auszustatten (ging auch nicht).
Danke vorab
habe zwei Fragen zu einem Code.
1. Warum werden nicht nur ungerade Zahlen ausgegeben?
2. Der Quellcode soll so Synchronisiert werden das nur ungerade Zahlen ausgegeben werden ohne eine weiter Variabele oder die main Methode zu ändern.
Java:
package Aufgabe2;
public class Counter extends Thread {
static Integer counter = 0;
public void run() {
while (counter < 1000) {
increment();
System.out.println(counter);
increment();
}
}
private void increment() {
counter++;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new Counter().start();
}
}
Zu 1. Es werden deswegen nicht nur ungerade Zahlen ausgegeben weil die Threads um das Objekt counter konkurrieren. Sie greifen alle auf das Objekt zu und verändern es. Somit ist immer unklar welcher Wert in counter steckt. Dazu kommt das System.out.println gepuffert wird und man nicht genau sagen kann wann die Ausgabe erfolgt und wann eben das Objekt erneut geändert wurde.
Kann man das verstehen und wäre das ansatzweise Korrekt?
Zu 2.
Hier bin ich gescheitert und glaube das ich synchronized nicht verstehe :-(
Java:
package Aufgabe2;
public class Counter extends Thread {
static Integer counter = 0;
public Counter(String n) {
super(n);
}
public void run() {
while (counter < 1000) {
synchronized (this) {
System.out.print("Name: " + this.getName() + " ");
increment();
System.out.println(counter);
increment();
}
}
}
private void increment() {
counter++;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new Counter("" + i).start();
}
}
Das war meine Idee. Leider ohne Erfolg. Bin davon ausgegangen das synchronized für das Objekt Counter mit der instanz 0 z. B. dann blockiert und erst diese instanz fertig laufen darf. Das scheint wohl nicht so zu sein oder? Das wäre jedoch sehr merkwürdig da man dann ja nie eine Klasse die Synchronisiert ist mit mehreren instanzen synchron laufen lassen dürft! Deswegen muss meine Annahme wohl falsch sein. Wo dann der Fehler steckt weiß ich nicht. Der aller erste Ansatz war die increment Methode mit synchronized auszustatten (ging auch nicht).
Danke vorab