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
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);
}
}
}