Этот тупик решен (столовые философы)? - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно решить тупиковую ситуацию с проблемой философов-столовых, и хотя я думаю, что сделал это, я не уверен, есть ли еще проблема, которую я еще не видел. Мое решение довольно простое, что делает меня неуверенным.

Вот часть моего класса палочек, которую я заблокировал:

    boolean inUse;
    ReentrantLock lock = new ReentrantLock();

    public void pickUp() throws InterruptedException {
        lock.lock();
        try {
            while (isInUse()) {
                Thread.sleep(100);
            }
            setInUse(true);
        }
        finally {
            lock.unlock();
        }
    }

Я использовал ReentrantLock, чтобы убедиться, что два потока не могут взять палочку одновременно. Таким образом, даже если расписание назначит другой поток для выполнения, блокировка предотвратит возможность выбора этой палочки. Мое решение сейчас состоит в том, чтобы сделать это:

public void run() {
        try {
            while (true) {
                leftChopstick.pickUp();
                if(!rightChopstick.inUse) {
                    rightChopstick.pickUp();
                    eat();
                    rightChopstick.putDown();
                }
                leftChopstick.putDown();
                think();
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

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

Это работает? Является ли освобождение используемых ресурсов плохой идеей для решения тупика? Есть ли еще тупик, которого я еще не видел?

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