Jednoczesny dostęp dwóch wątków.

0

Witam.
Czy istnieje możliwość symulacji takiej sytuacji :
Powiedzmy, że mamy listę z książkami , w ów liście pozostała jedna pozycja. Jest dwóch klientów, którzy chcą kupić tą książkę. Oboje widzą dostępność tej jednej pozycji. W tym samym czasie klikają przycisk zamów. Chciałbym zrobić symulację takiej sytuacji i powstałego błędu z wykorzystaniem wątków. Czy jest taka możliwość ? Próbowałem ustawić opóźnienie na obu wątkach aby jednocześnie się odpaliły ale chyba to nie zdało egzaminu. Zna ktoś inny sposób ?

Pozdrawiam.

1

testuwanie współbieżności to zawsze grząski grunt. Ale w tym przypadku to jest dosyć prosta sprawa.

  1. 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.

  2. 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++;
				}
			} 
		}
	}

}

0

Generalnie problem współbieżnej modyfikacji jest dość trudny do przetestowania. Na początek pytanie czy zależy ci na przetestowaniu zachowania biznesowego czy "w kodzie". To pierwsze jest znacznie prostsze do zrobienia ponieważ stosunkowo łatwo napisać mocka, który zachowa się w następujący sposób:

  • metoda czyDostępna zwróci prawda
  • metoda pobierzDostępnyElement zwróci błąd - brak elementów.

Symulowanie sytuacji od strony kodu patrz wyżej.

0

Dziękuję za pomocne odpowiedzi. Na pewno wykorzystam uwagi.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1