Как реализовать библиотеку книг с помощью многопоточной программы? - PullRequest
1 голос
/ 24 декабря 2011

Скажем, есть книжная библиотека. Люди могут брать книги и возвращать книги. Есть одна или несколько копий из каждой книги.

Предположим, что:
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 для заимствования книг невозможно, чтобы книги не было.

Основная проблема в том, что мы теряем смысл многопоточной программы, когда блокируем всю библиотеку каждый раз, когда поток занимает книги.

Кажется, что другие альтернативы вызывают тупики.

Есть ли у вас какие-либо предложения для более одновременного решения, которое также безопасно и имеет жизнеспособность?

1 Ответ

1 голос
/ 24 декабря 2011

Сохраняйте структуру для каждой книги, чтобы поток мог блокироваться до тех пор, пока не будет возвращена определенная книга.

Пусть каждый заемщик подождет хотя бы одну нужную ему книгу.Когда он проснется, попросите его проверить, все ли нужные ему книги доступны.Если это так, он должен взять их всех и уйти.Если нет, ему следует выбрать одну из нужных ему книг, которых нет в наличии, и ждать ее.

Однако это может привести к тому, что некоторые заемщики будут ждать вечно.Чтобы избежать этого, используйте специальный алгоритм приоритета.Держите очередь заемщиков в порядке прибытия.Поместите новых заемщиков в конец очереди.Затем просто внедрите одно правило - если есть какая-то книга, в которой нуждается главный заемщик, ее может взять только главный заемщик.

Это оставит один особый случай, с которым вам придется иметь дело: заемщик не является главным заемщиком,все книги, в которых он нуждается, доступны, но он не может взять их, потому что одна из книг нужна главному заемщику.В этом случае имейте специальное событие "главный заемщик ушел", которого заемщик может ждать.Когда заемщик получает все свои книги, проверьте, был ли он главным заемщиком, и, если это так, разблокируйте все потоки, ожидающие этого события.

У любого данного заемщика в любое время есть некоторое конечное число заемщиков.,Это число не может увеличиться.И это уменьшится, потому что один из заемщиков впереди вас (главный) имеет абсолютный приоритет, и каждая книга возвращается в конце концов.Ни один заемщик никогда не держит книгу, пока она ждет других книг.Так что это должно быть без тупиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...