Скажите, что есть книжная библиотека. Люди могут брать книги и возвращать книги. В каждой книге есть одна или несколько копий.Как реализовать библиотеку книг с многопоточной программой?
Предположим, что:
1. Если человек приходит в библиотеку со списком книг, он не покинет библиотеку без всех книг. 2. Невозможно, чтобы в каком-то списке заемщиков были книги, библиотека которых не имеет хотя бы одного экземпляра.
Мы согласны с тем, что заемщики представлены потоками.
я могу думать только один вариант для его реализации:
public synchronized void borrowBooks(final ArrayList<Item> booksList)
{
try {
while (!areBooksPresent(booksList)) {
this.wait();
}
} catch (InterruptedException e) {}
for (Book book : booksList) {
Book libraryBook = findBook(book);
/* Decrement the book's amount in the library */
libraryBook.decAmount();
}
}
public synchronized void returnBooks(final ArrayList<Item> booksList)
{
for (Book book : booksList) {
Book libraryBook = findBook(book);
/* increment the book's amount in the library */
libraryBook.incAmount();
/* Notify to all awaiting threads that the monitor is freed */
this.notifyAll();
}
}
Как вы можете видеть, как поток начинает занимать свои книги, вся библиотека закрыта, и никакой другой поток не может занимать в то же время. Мы также гарантируем, что в цикле for
для заимствования книг невозможно, чтобы книги не было.
Основная проблема заключается в том, что мы теряем всю точку многопоточной программы, когда мы блокируем всю библиотеку каждый раз, когда поток заимствует книги.
Другие альтернативы, по-видимому, вызывают взаимоблокировки.
У вас есть предложения для более параллельного решения, которое также безопасно и имеет жизнестойкость?
Очередь для каждой книги? –
Вам не нужна очередь для каждой книги. Но вы (потенциально) нуждаетесь в событии для каждой книги, которая была заимствована, которую ждет поток. –