僵局得到解决了吗(吃饭的哲学家)?

时间:2019-05-19 16:10:25

标签: java deadlock

我必须解决餐饮哲学家问题上的僵局,尽管我认为我做到了,但我不确定是否还有我尚未发现的问题。我的解决方案很简单,这使我不安全。

这是我锁住的筷子课的一部分:

    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();
        }
    }

当右筷子已经在使用中时,线程会释放左筷子。

这有效吗?释放使用的资源是否是解决僵局的坏主意?我还没有看到僵局吗?

0 个答案:

没有答案
相关问题