Hallo Experten,
Kann mir bitte jemand erklären, weshalb folgender Code nicht thread-safe ist? Habe diesen auf einer Multiprozessor Machine laufen gelassen. Die 10 Konsolen-Ausgaben, sind Werte wie zum Beispiel 100.0, 200.0, 300.0 und 500.0 und nicht wie angenommen 0.0. Weshalb?
public class TAccount {
private volatile double balance = 0;
public synchronized void deposit(double amount) {
balance += amount;
}
public synchronized void withdraw(double amount) {
balance -= amount;
}
public synchronized double getBalance() {
return balance;
}
}
public class myT implements Runnable {
private static TAccount first;
public static void main(String[] args) {
first = new TAccount();
Thread t[] = new Thread[10];
for (int i=0; i
Besten Dank für die Hilfe
Simon
Hi.
Die Annahme, dass alle Ausgaben 0.0 sein müssen, ist nicht korrekt. Lediglich die letzte Ausgabe muss 0 sein. Du addierst 10*100=1000-mal 100 zu 0 und ziehst 1000-mal 100 ab. Allerdings steht nirgendwo, dass nach einer Addition nicht erstmal ein anderer Thread drankommen darf und auch mal 100 addiert. Die Additionen, Subtraktionen und Ausgaben können also ziemlich gemischt werden, wobei zu keinem Zeitpunkt mehr Subtraktionen als Additionen ausgeführt sein können (balance ist also immer positiv) und auch nicht mehr Ausgaben als Subtraktionen ausgeführt sein können (Der maximale Ausgabe ist daher 99900.).
Sebastian.
Hi
Deine Aussage ist natürlich korrekt, dass nicht alle Ausgaben 0.0 sein müssen. Trotzdem, auch die letzte Ausgabe ist häufig nicht 0.0. Ideen?
Simon
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo
Herzlichen Dank für die Feedbacks. Konnte das Problem lösen.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
abend,
für uns und das archiv: _wie_ konntest du es lösen?
zebulon