Hey Leute,
hab zu Testzwecken ein kleines Programm erstellt:
[JAVA=42]
public class Main{
//ist gesetzt, sobald ein Thread die Methode f() nach Überprüfung des Flags betritt
static boolean flag=false;
//wird als Monitor missbraucht
final static Object o = new Object();
public void f(){
synchronized(o){
if(flag=true){System.out.println("Fehler!!");System.exit(1);}
flag=true;
//Zeit schinden
for(int i=0;i<Integer.MAX_VALUE;++i){
int j=0;
j++;
}
flag=false;
}
}
public static void main(String[] args){
final Main m1 = new Main();
final Main m2 = new Main();
new Thread(){
@Override
public void run(){
while(true){
m1.f();
}
}
}.start();
new Thread(){
@Override
public void run(){
while(true){
m2.f();
}
}
}.start();
}
}
[/code]
Das Klasse Main sollte eigentlich so realisiert sein, dass zwei Threads sich nicht gleichzeitig in der Mehtode f() befinden können.
Wäre dem so, dürfte niemals der String "Fehler" ausgegen werden, doch dem ist leider nicht so.
Seht ihr warum, die Funktion f() nicht atomar ausgeführt wird?
Gruß
hab zu Testzwecken ein kleines Programm erstellt:
[JAVA=42]
public class Main{
//ist gesetzt, sobald ein Thread die Methode f() nach Überprüfung des Flags betritt
static boolean flag=false;
//wird als Monitor missbraucht
final static Object o = new Object();
public void f(){
synchronized(o){
if(flag=true){System.out.println("Fehler!!");System.exit(1);}
flag=true;
//Zeit schinden
for(int i=0;i<Integer.MAX_VALUE;++i){
int j=0;
j++;
}
flag=false;
}
}
public static void main(String[] args){
final Main m1 = new Main();
final Main m2 = new Main();
new Thread(){
@Override
public void run(){
while(true){
m1.f();
}
}
}.start();
new Thread(){
@Override
public void run(){
while(true){
m2.f();
}
}
}.start();
}
}
[/code]
Das Klasse Main sollte eigentlich so realisiert sein, dass zwei Threads sich nicht gleichzeitig in der Mehtode f() befinden können.
Wäre dem so, dürfte niemals der String "Fehler" ausgegen werden, doch dem ist leider nicht so.
Seht ihr warum, die Funktion f() nicht atomar ausgeführt wird?
Gruß