Probleme mit einem einfachen Thread

Hallo!

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
 
Zurück