Lost-Update Semaphore

Sonnenblume123

Aktives Mitglied
Hallo,

also die Aufgabe war, welche Werte guthaben annehmen kann, wenn
Konto k = new Konto(); ist. Ich habe da:
11, 22, 33, 31. Nach ein paar Mal ausführen, hab ich da mal 30 gesehen und könnt mir nicht erklären wieso.
Dann kommt Klasse Konto2 ins Spiel, wo ich gefragt wurde, was guthaben für Werte annehmen kann, wenn Konto k = new Konto2(); ist.
Ich dachte nur 31 und 33. Jedoch hab ich gesehen, dass noch 22 und 11 möglich sind. Jetzt dacht ich eigentlich, dass es durch die Semaphore sichergestellt ist, dass nur ein Thread jeweils eine Methode ausführen kann.
Hoffe ihr könnt mir helfen:)
Code:
import java.util.concurrent.Semaphore;

public class Konto {
    protected double guthaben = 0;

    public void einzahlen(double betrag) {
        guthaben = guthaben + betrag;
       
    }

    public void verzinsen() {
        guthaben = guthaben + (guthaben * 0.1);
       

    }
   
    public double guthaben() {
        return guthaben;
    }
   
    public static void main(String[] args) throws InterruptedException {
        final Konto k = new Konto2();
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                k.einzahlen(10);
                k.verzinsen();
            }
        });
       
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                k.einzahlen(20);
               
               
            }
        });
       
        t1.start(); t2.start();
        t1.join(); t2.join();
        System.out.println("guthaben: " + k.guthaben());
    }
   
    static class Konto2 extends Konto{
        static Semaphore s = new Semaphore(1);
        public void einzahlen(float betrag) {
            try {
                s.acquire();
                guthaben = guthaben + betrag;
                s.release();
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
        public void verzinsen() {
            einzahlen(guthaben * 0.1);
        }
    }
}
 

httpdigest

Top Contributor
30.0 ist möglich, nachdem Thread1 10.0 eingezahlt hat und sich jetzt in verzinsen() befindet und Thread2 sich gleichzeitig in einzahlen(20) befindet. Da beide Methoden nicht synchronisiert sind, kann es jetzt passieren, dass Thread2 das Feld `guthaben` liest noch bevor Thread1 innerhalb von verzinsen() das Ergebnis geschrieben hat, und jetzt Thread1 sein Ergebnis innerhalb von verzinsen() in das Feld schreibt, aber das Ergebnis sofort anschließend wieder von Thread2 in seinem einzahlen(20) Aufruf überschrieben wird. Merke: Thread2 glaubte da noch, dass `guthaben` == 10.0 war, weil er `guthaben` gelesen hat, bevor Thread1 in verzinsen() den neuen verzinsten Wert geschrieben hat.
 

httpdigest

Top Contributor
Dasselbe Problem besteht übrigens auch mit Konto2, da das Lesen von guthaben in verzinsen() nicht mit dem Schreiben in einzahlen() synchronisiert wird. Und die Ergebnisse 11 und 22 entstehen aus demselben Grund, nur mit unterschiedlicher Reihenfolge vom Lesen und Schreiben von guthaben zwischen Thread1 und Thread2.
 

httpdigest

Top Contributor
Könnte ich das Problem für Konto lösen, wenn ich einzahlen synchronized mache?
Nein. Das Problem ist nicht, dass mehrere Threads einzahlen() aufrufen, sondern dass ein Thread einzahlen() aufruft während ein anderer verzinsen() aufruft und die dort getätigten Lese- und Schreiboperationen um das Feld guthaben konkurrieren. Du müsstest schon sowohl einzahlen() als auch verzinsen() als synchronized markieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Lost of precisson Java Basics - Anfänger-Themen 2
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
G Konstruktor und update Java Basics - Anfänger-Themen 4
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
K Schlüsselworte Nach Java update findet mdb Datei nicht Java Basics - Anfänger-Themen 6
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
J fehler nach windows update Java Basics - Anfänger-Themen 44
Y Observer update Java Basics - Anfänger-Themen 3
G Threads Konstantes Update Java Basics - Anfänger-Themen 1
X Eventservice Probleme nach Update Java Basics - Anfänger-Themen 0
B VAriables update in for-Schelifen Java Basics - Anfänger-Themen 3
L Jar aus Jar Starten lassen (Update Tool) Java Basics - Anfänger-Themen 6
P Update System Java Basics - Anfänger-Themen 16
R Nach Ubuntu-Update: Konsole spuckt bei neu Kompilierten Programmen Fehler aus (BlueJ)(Ubuntu12.04) Java Basics - Anfänger-Themen 11
L Auf herunterfahren des PCs reagieren und Datensatz update machen Java Basics - Anfänger-Themen 15
K Threads jProgressBar update Java Basics - Anfänger-Themen 14
Gugelhupf JDK installieren Fehlermeldung 1336 - Java SDK 7 Update 5 x64 Java Basics - Anfänger-Themen 4
A JDK installieren Java update - neu installieren? Java Basics - Anfänger-Themen 7
R JDK installieren Nach Update auf java 1.7 Connection refused Java Basics - Anfänger-Themen 9
E Programm - Update via Internet? Java Basics - Anfänger-Themen 5
B JDK installieren Java SE Development Kit 6 Update 25 Java Basics - Anfänger-Themen 5
M Update-Ticker... String in Textdatei schreiben und auslesen Java Basics - Anfänger-Themen 5
S MVC Prinzip - update() ? Java Basics - Anfänger-Themen 2
B Problem mit prepareStatement UPDATE Java Basics - Anfänger-Themen 2
M Serializable - Bei Update ältere Daten importieren Java Basics - Anfänger-Themen 14
C JAVA - Einstieg mit Eclipse - Update Sites und Ähnliches Java Basics - Anfänger-Themen 6
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
hdi Fehler beim Model-Update einer JList (DefaultListModel) Java Basics - Anfänger-Themen 3
A update/draw schleife Java Basics - Anfänger-Themen 5
S update wird nicht aufgerufen Java Basics - Anfänger-Themen 9
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
A label update Java Basics - Anfänger-Themen 10
Y JDK 6 Update 5 with Java EE? Java Basics - Anfänger-Themen 2
M Java SQL-Update Java Basics - Anfänger-Themen 6
A per "update" ein Bild Strich für Strich "male Java Basics - Anfänger-Themen 9
S Ein Update System programmieren Java Basics - Anfänger-Themen 27
P Zeichenprogramm-->update() aushebeln Java Basics - Anfänger-Themen 11
S SQL UPDATE in Java "wie schreiben"? Java Basics - Anfänger-Themen 6
E Update JList Java Basics - Anfänger-Themen 13
J Problem bei Update auf Datenbank Java Basics - Anfänger-Themen 2
K Observer Observable update() . Java Basics - Anfänger-Themen 13
R JRE 1.5.0 Update 7 Install erkennt nicht Firefox/Netscape Java Basics - Anfänger-Themen 3
M [SOLVED]update() bei MVC Java Basics - Anfänger-Themen 4
M Datenbankabfrage mit UPDATE Java Basics - Anfänger-Themen 4
M Unterschied zwischen J2SE 5.0 Update x und J2SE 1.4.x Java Basics - Anfänger-Themen 4
N Array aus JCheckBox? 1000 if's UPDATE: Spaltennamen auslesen Java Basics - Anfänger-Themen 12
G Update auf Datenbankspalte vom Typ Timestamp mit aktu. Datum Java Basics - Anfänger-Themen 3
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
B Race Condition mittels Semaphore verhindern Java Basics - Anfänger-Themen 13
S binäre semaphore Java Basics - Anfänger-Themen 4
tanja Semaphore Java Basics - Anfänger-Themen 2
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben