testuwanie współbieżności to zawsze grząski grunt. Ale w tym przypadku to jest dosyć prosta sprawa.
-
Startujesz 2 wątki które w pętli nieskończonej czytaja listę książek, wybierają tą jedną ulubioną (np. Diuna) wypożyczają ją, po czym po chwili zwracają. Nie dodawaj tam żadnych system.out.println, bo to jest taka niejawna synchronizacja na buforze do systemu operacyjnego i byc może nie zobaczysz nigdy błędu. Te watki mozna ponazywać, będzie ciekawiej.
-
Możesz wypróbowac jak to działa z jednym, dwoma, tysiącem wątków (oprócz tego komunikatu, zobaczysz jeszcze pare innych błedów w różnych miejscach). Możesz wypróbować co się dzieje jak masz twoją bibliotekę niesynchronizowaną, i co sie dzieje jak odpowiednio zabezpieczysz. Możesz policzyć przepustowośći skalowalność.
Poniżej przykładowy testowy klient. Bibliotekę zrobisz sobie sam.
PROGRAM TESTOWY:
public static void main(String[] args) {
BookServer bs = new BookServer();
Thread t1 = new Thread(new Client(bs));
Thread t2 = new Thread(new Client(bs));
t1.start();
t2.start();
}
KLIENT:
private static class Client implements Runnable {
private BookServer library;
private int counter = 0;
public Client(BookServer bs) {
this.library = bs;
}
public void run() {
while (true) {
Collection<String> books = library.listBooks();
Thread.yield();
if (books.contains(DIUNA)) {
boolean iHaveAbook = library.borrowBook(DIUNA);
if (!iHaveAbook) {
System.out
.println("Oszukali mnie, nie ma ksiazki. Udalo sie poprawnie wyporzyczyc "
+ counter + " razy.");
return;
} else {
library.returnBook(DIUNA);
counter++;
}
}
}
}
}