hallo,
ich les hier gerade eine vorlesung über java, und es geht um threads, race conditions, sowie synchronisation.
also ich verstehe schon das konzept von monitoren auf objekten in java.
jetzt hab ich mich aber gefragt: wie isn das bei statischen methoden, wenn man also quasi kein objekt hat? geht das überhaupt (darauf wird nämlich in der vorlesung nicht eingegangen)
ich hab mir dann mal folgendes programm geschrieben:
ein ergebis der ausführung ergibt zB:
man sieht hier also deutlich die race condition. aber ich hab ne frage dazu:
die "globalCount" ist IMMER genau 1000000. Ich habe das Programm ca. 100 mal oder öfters getestet.
Erwartet hatte ich eigentlich, dass sie mal 1000001 ist oder noch etwas höher :/
Ist das jetz Zufall? Oder wieso ist es immer genau 1000000 ?
Also ich weiss nicht so recht, bin verwirrt..
Da es von der Syntax her in Java geht, eine statische Methode synchronized zu setzen, muss wohl eine Synchronisation über globale Variablen funktionieren. Aber wie? Oder irre ich mich doch?
dankeschön!
ich les hier gerade eine vorlesung über java, und es geht um threads, race conditions, sowie synchronisation.
also ich verstehe schon das konzept von monitoren auf objekten in java.
jetzt hab ich mich aber gefragt: wie isn das bei statischen methoden, wenn man also quasi kein objekt hat? geht das überhaupt (darauf wird nämlich in der vorlesung nicht eingegangen)
ich hab mir dann mal folgendes programm geschrieben:
Code:
package tests;
public class Main {
public static int count = 0;
public static final int MAX = 1000000;
public static void main(String[] args) {
new CountThread("t1").start();
new CountThread("t2").start();
}
}
class CountThread extends Thread {
String name;
int ownCount;
public CountThread(String string) {
name = string;
ownCount = 0;
}
@Override
public void run() {
increase();
}
public void increase() {
while (Main.count < Main.MAX) {
Main.count++;
ownCount++;
}
System.out.println(name + ": ownCount " + ownCount + " / globalCount " + Main.count);
}
}
ein ergebis der ausführung ergibt zB:
t2: ownCount 949775 / globalCount 1000000
t1: ownCount 946071 / globalCount 1000000
man sieht hier also deutlich die race condition. aber ich hab ne frage dazu:
die "globalCount" ist IMMER genau 1000000. Ich habe das Programm ca. 100 mal oder öfters getestet.
Erwartet hatte ich eigentlich, dass sie mal 1000001 ist oder noch etwas höher :/
Ist das jetz Zufall? Oder wieso ist es immer genau 1000000 ?
Also ich weiss nicht so recht, bin verwirrt..
Da es von der Syntax her in Java geht, eine statische Methode synchronized zu setzen, muss wohl eine Synchronisation über globale Variablen funktionieren. Aber wie? Oder irre ich mich doch?
dankeschön!