Commit 0b9dea27 by Patryk Czarnik

Konto w wątkach - synchronized

parent 65318c6b
...@@ -38,14 +38,17 @@ public class Konto { ...@@ -38,14 +38,17 @@ public class Konto {
return saldo; return saldo;
} }
public void wplata(int kwota) { // Gdy jeden wątek wykonuje metodę lubblok synchronizowany na obiekcie X,
// to żaden inny wątek nie może wejść do metody lub sekcji synchronizowanej
// NA TYM SAMYM OBIEKCIE. Taki wątek czeka, aż wykonujący wyjdzie z kodu synchronizowanego.
public synchronized void wplata(int kwota) {
if(kwota <= 0) { if(kwota <= 0) {
throw new IllegalArgumentException("Kwota wpłaty nie jest dodatnia"); throw new IllegalArgumentException("Kwota wpłaty nie jest dodatnia");
} }
saldo += kwota; saldo += kwota;
} }
public void wyplata(int kwota) throws BrakSrodkow { public synchronized void wyplata(int kwota) throws BrakSrodkow {
if(kwota <= 0) { if(kwota <= 0) {
throw new IllegalArgumentException("Kwota wypłaty nie jest dodatnia"); throw new IllegalArgumentException("Kwota wypłaty nie jest dodatnia");
} }
...@@ -55,7 +58,7 @@ public class Konto { ...@@ -55,7 +58,7 @@ public class Konto {
saldo -= kwota; saldo -= kwota;
} }
public void przelew(Konto cel, int kwota) throws BrakSrodkow { public synchronized void przelew(Konto cel, int kwota) throws BrakSrodkow {
if(kwota <= 0) { if(kwota <= 0) {
throw new IllegalArgumentException("Kwota przelewu nie jest dodatnia"); throw new IllegalArgumentException("Kwota przelewu nie jest dodatnia");
} }
...@@ -63,6 +66,10 @@ public class Konto { ...@@ -63,6 +66,10 @@ public class Konto {
throw new BrakSrodkow("Za mało środków na koncie nr " + numer); throw new BrakSrodkow("Za mało środków na koncie nr " + numer);
} }
this.saldo -= kwota; this.saldo -= kwota;
cel.saldo += kwota; // uwaga - w tej wersji istnieje ryzyko "zakleszczenia" / deadlock
// gdyby dwa wątki w tym samym czasie chciały robić przelew z A na B i z B na A
synchronized (cel) {
cel.saldo += kwota;
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment