G
Guest
Gast
hey,
ich habe mir folgendes programm gebastelt, um eine race condition sichtbar zu machen:
es arbeitet auch so, wie erwartet. das heisst, dass meistens der wert von count (die globale variable, nicht die instanzvariable) am schluss nicht 100000 ist, sondern 1000001.
ausserdem ist der wert von total am schluss meist (weit) über 100000.
passt also.
nun wollte ich aber die race condition vermeiden, und das synchronisieren.
ich kann aber laut eclipse keinen integer-wert synchronisieren.. sprich:
geht nicht!
genauso wenig kann ich die variable selbst als synchronized deklarieren! das is auch n syntax error..
diese java-oo ist ja ne feine sache, aber manchmal frage ich mich, ob sie es nicht etwas übertrieben haben...
wie kann ich denn jetzt den zugriff auf die _statische_ variable "count" (in der Klasse ThreadTest) synchronisieren?
ich hab hier in meinem skript ein beispiel, wo sie ein objekt synchronisieren. aber das hab ich ja hier gar nicht, ich will einfach nur den zugriff auf eine variable kontrollieren... und das geht wie?
danke
ich habe mir folgendes programm gebastelt, um eine race condition sichtbar zu machen:
Code:
public class MyThread implements Runnable{
private String name;
private int count;
public MyThread(String s){
count = 0;
name = s;
}
/* @Override */
public void run(){
while(ThreadTest.count < 1000000){
ThreadTest.count += 1; ThreadTest.total++; count++;
}
System.out.println(name+": STOP - count hat Wert: "+ThreadTest.count+" |my: "+count);
}
}
Code:
public class ThreadTest{
public static int count = 0;
public static int total = 0;
public static void main(String[] args) {
Thread t1 = new Thread (new MyThread("t1"));
Thread t2 = new Thread (new MyThread("t2"));
t1.start();
t2.start();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("GESAMT: "+total);
}
}
es arbeitet auch so, wie erwartet. das heisst, dass meistens der wert von count (die globale variable, nicht die instanzvariable) am schluss nicht 100000 ist, sondern 1000001.
ausserdem ist der wert von total am schluss meist (weit) über 100000.
passt also.
nun wollte ich aber die race condition vermeiden, und das synchronisieren.
ich kann aber laut eclipse keinen integer-wert synchronisieren.. sprich:
Code:
public void run(){
synchronized(ThreadTest.count){ ... }
}
genauso wenig kann ich die variable selbst als synchronized deklarieren! das is auch n syntax error..
diese java-oo ist ja ne feine sache, aber manchmal frage ich mich, ob sie es nicht etwas übertrieben haben...
wie kann ich denn jetzt den zugriff auf die _statische_ variable "count" (in der Klasse ThreadTest) synchronisieren?
ich hab hier in meinem skript ein beispiel, wo sie ein objekt synchronisieren. aber das hab ich ja hier gar nicht, ich will einfach nur den zugriff auf eine variable kontrollieren... und das geht wie?
danke