Commit ce2aed00 by Patryk Czarnik

Przykłady na synchronized

parent 114fa876
...@@ -24,7 +24,7 @@ class Konto { ...@@ -24,7 +24,7 @@ class Konto {
return numer; return numer;
} }
public int getSaldo() { public synchronized int getSaldo() {
return saldo; return saldo;
} }
...@@ -32,24 +32,38 @@ class Konto { ...@@ -32,24 +32,38 @@ class Konto {
return "Konto nr " + numer + ", saldo: " + saldo + ", wł.: " + wlasciciel; return "Konto nr " + numer + ", saldo: " + saldo + ", wł.: " + wlasciciel;
} }
public void wplata(int kwota) { public synchronized void wplata(int kwota) {
if(kwota < 0) { if(kwota < 0) {
throw new IllegalArgumentException("Ujemna kwota " + kwota + " we wpłacie"); throw new IllegalArgumentException("Ujemna kwota " + kwota + " we wpłacie");
} }
saldo += kwota; saldo += kwota;
notify();
} }
public void wyplata(int kwota) throws BrakSrodkow { public synchronized void wyplata(int kwota) throws BrakSrodkow {
if(kwota < 0) { if(kwota < 0) {
throw new IllegalArgumentException("Ujemna kwota " + kwota + " w wypłacie"); throw new IllegalArgumentException("Ujemna kwota " + kwota + " w wypłacie");
} }
if(kwota > saldo) { if(kwota > saldo) {
throw new BrakSrodkow("Brak środków na koncie nr " + numer); throw new BrakSrodkow("Brak środków na koncie nr " + numer);
} }
saldo -= kwota; saldo -= kwota;
} }
public synchronized void wyplataCzekaj(int kwota) throws BrakSrodkow {
if(kwota < 0) {
throw new IllegalArgumentException("Ujemna kwota " + kwota + " w wypłacie");
}
try {
while(kwota > saldo) {
wait();
}
saldo -= kwota;
notify();
} catch (InterruptedException e) {
}
}
} }
...@@ -9,7 +9,7 @@ class Przeploty { ...@@ -9,7 +9,7 @@ class Przeploty {
final int KWOTA = 10; final int KWOTA = 10;
Osoba ala = new Osoba("Ala", "Kowalska", LocalDate.now()); Osoba ala = new Osoba("Ala", "Kowalska", LocalDate.now());
Konto konto = new Konto(1, 1000_000, ala); Konto konto = new Konto(1, 1_000_000, ala);
System.out.println(konto); System.out.println(konto);
Thread wplacacz = new Thread(() -> { Thread wplacacz = new Thread(() -> {
...@@ -22,6 +22,13 @@ class Przeploty { ...@@ -22,6 +22,13 @@ class Przeploty {
for(int i = 0; i < N; i++) { for(int i = 0; i < N; i++) {
try { try {
konto.wyplata(KWOTA); konto.wyplata(KWOTA);
// w razie gdyby nie bylo jednej metody,
// to trzeba by synchronizować łącznie odczyt i zapis
// synchronized (konto) {
// int saldo = konto.getSaldo();
// konto.setSaldo(salso + 100);
// }
} catch (BrakSrodkow e) { } catch (BrakSrodkow e) {
System.err.println(e.getMessage()); System.err.println(e.getMessage());
} }
...@@ -33,6 +40,9 @@ class Przeploty { ...@@ -33,6 +40,9 @@ class Przeploty {
wyplacacz.start(); wyplacacz.start();
System.out.println("Czekam na zakończenie"); System.out.println("Czekam na zakończenie");
wplacacz.interrupt();
try { try {
wplacacz.join(); wplacacz.join();
wyplacacz.join(); wyplacacz.join();
......
package p04_watki.konta.v_wlasna_proba;
import java.io.IOException;
class WyplacanieZCzekaniem {
static volatile boolean koniec = false;
public static void main(String[] args) {
final Osoba ala = new Osoba("Ala", "Kowalska", "2001-01-01");
final Konto konto = new Konto(1, 1700, ala);
System.out.println("początek " + konto);
Thread wplacacz = new Thread(new Runnable() {
public void run() {
while (!koniec) {
konto.wplata(1000);
System.out.println("wpłacacz: wpłaciłem 1000, saldo = " + konto.getSaldo());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
}
}
});
Thread wyplacacz = new Thread(new Runnable() {
public void run() {
while (!koniec) {
try {
konto.wyplataCzekaj(100);
} catch (BrakSrodkow e) {
System.err.println("BRAK ŚRODKÓW");
}
System.out.println("wypłacacz: wypłaciłem 100, saldo = " + konto.getSaldo());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
}
});
wplacacz.start();
wyplacacz.start();
System.out.println("Wątki wystartowały");
System.out.println("Naciśnij enter aby zakończyć");
try {
System.in.read();
} catch (IOException e1) {
}
koniec = true;
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
System.err.println("INTERRUPTED");
}
System.out.println("na końcu: " + konto);
}
}
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