
package javacodebook.thread.syncblock1;

import java.util.Random;

/**
 *
 * @author Mark Donnermeyer
 */
class UnsyncIncThread extends Thread {
    private static Random random = new Random(System.currentTimeMillis());
    
    private Data data;
    private int  inc;
    
    public UnsyncIncThread(String name, Data data, int inc) {
        super(name);
        this.data = data;
        this.inc  = inc;
    }
    
    /**
     * Der aktuell in dem Objekt data stehende Wert wird 5x in unregelmässigen
     * zeitlichen Abständen um den Wert inc erhöht. Zwischen dem lesenden Zugriff
     * und dem schreibenden Zugriff wird der Thread für 100 ms schlafen gelegt.
     * In dieser Zeit können andere Threads Werte in das Objekt data schreiben,
     * was zu Fehlern in der Berechnung führt. Auch ohne die 100 ms Schlaf 
     * zwischen lesendem und schreibendem Zugriff könnte das passieren.
     */
    public void run() {
        for (int i=0; i<5; i++) {
            int number = data.get();
            System.out.println(getName() + ": Neuer Wert: " + (number+inc));
            sleepRandomly(100);
            data.set(number+inc);
            sleepRandomly(1000);
        }
    }
    
    /**
     * Legt den Thread für eine zufällige Zeit zwischen 0 und max Millisekunden
     * schlafen.
     */
    private void sleepRandomly(int max) {
        try {
            sleep(random.nextInt(max));
        }
        catch (Exception ignore) {}
    }
}