Thomas Darimont
Erfahrenes Mitglied
Hallo!
Das ganze wird an diesem Beispiel hier klarer:
Die Methode count() wird von beiden Thread konkurrierend genutzt.
Wenn ich nun den Variablenwert lese, eine weile schlafe und danach den zuvor gelesenen Wert um eins erhöhe und zurückschreiben will bekomme ich
Probleme, da der andere Thread in meiner Schlafperiode aktiv wurde und das selbe tat.
Beispiel:
Thread0.start();
Thread1.start();
Thread-0 liest: 0
Thread-1 liest: 0
Thread-1 schreibt: 1
****************************
Thread-1 liest: 1
Thread-0 schreibt: 1
****************************
Thread-0 liest: 1
Thread-0 schreibt: 2
****************************
Thread-0 liest: 2
Thread-1 schreibt: 2
****************************
Thread-1 liest: 2
Thread-0 schreibt: 3
****************************
Thread-0 liest: 3
Thread-1 schreibt: 3
****************************
Thread-1 liest: 3
Thread-0 schreibt: 4
****************************
Thread-0 liest: 4
Thread-1 schreibt: 4
****************************
Thread-1 liest: 4
Thread-0 schreibt: 5
****************************
Thread-0 liest: 5
Thread-0 schreibt: 6
****************************
Thread-0 liest: 6
Thread-0 schreibt: 7
****************************
Thread-0 liest: 7
Thread-1 schreibt: 5 <--- OPS!
****************************
Thread-1 liest: 5
Thread-1 schreibt: 6
****************************
Thread-1 liest: 6
Thread-0 schreibt: 8
****************************
Thread-0 liest: 8
Thread-0 schreibt: 9
****************************
Gruß Tom
Das ganze wird an diesem Beispiel hier klarer:
Code:
/*
* Created on 05.07.2004
*
* TODO
*/
/**
* @author Administrator TODO Describe what the class is used for
*/
public class FirstThread extends Thread {
public static int cnt = 0;
public static void main(String[] args) {
FirstThread ft1 = new FirstThread();
FirstThread ft2 = new FirstThread();
ft1.start();
ft2.start();
}
public void run() {
while (cnt < 200) {
count(this.getName());
}
}
//public static synchronized void count(String name) {
public synchronized static void count(String name) {
//Wir speichern uns den aktuellen Wert zwischen...
int _cnt = cnt;
System.out.println(name + " liest: " + cnt);
try {
//Wir schlafen eine Runde
Thread.sleep(100L + (long) Math.abs(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//Wir weisen cnt den um 1 erhöhten wert unserer zwischengespeicherten Variablen zu
cnt = _cnt + 1;
System.out.println(name + " schreibt: " + cnt);
System.out.println("****************************");
}
}
Die Methode count() wird von beiden Thread konkurrierend genutzt.
Wenn ich nun den Variablenwert lese, eine weile schlafe und danach den zuvor gelesenen Wert um eins erhöhe und zurückschreiben will bekomme ich
Probleme, da der andere Thread in meiner Schlafperiode aktiv wurde und das selbe tat.
Beispiel:
Thread0.start();
Thread1.start();
Thread-0 liest: 0
Thread-1 liest: 0
Thread-1 schreibt: 1
****************************
Thread-1 liest: 1
Thread-0 schreibt: 1
****************************
Thread-0 liest: 1
Thread-0 schreibt: 2
****************************
Thread-0 liest: 2
Thread-1 schreibt: 2
****************************
Thread-1 liest: 2
Thread-0 schreibt: 3
****************************
Thread-0 liest: 3
Thread-1 schreibt: 3
****************************
Thread-1 liest: 3
Thread-0 schreibt: 4
****************************
Thread-0 liest: 4
Thread-1 schreibt: 4
****************************
Thread-1 liest: 4
Thread-0 schreibt: 5
****************************
Thread-0 liest: 5
Thread-0 schreibt: 6
****************************
Thread-0 liest: 6
Thread-0 schreibt: 7
****************************
Thread-0 liest: 7
Thread-1 schreibt: 5 <--- OPS!
****************************
Thread-1 liest: 5
Thread-1 schreibt: 6
****************************
Thread-1 liest: 6
Thread-0 schreibt: 8
****************************
Thread-0 liest: 8
Thread-0 schreibt: 9
****************************
Gruß Tom