当前位置:  开发笔记 > 编程语言 > 正文

餐饮哲学家在Java中的信号量问题

如何解决《餐饮哲学家在Java中的信号量问题》经验,为你挑选了1个好方法。

我正在努力学习餐饮哲学家问题中信号量的基本要点.现在,我有一个类Chopstick,每个Chopstick都有一个信号量,有1个可用的许可证:

public class Chopstick
{
    Thread holder = null;
    private Semaphore lock = new Semaphore(1);

    public synchronized void take() throws InterruptedException
    {
        this.lock.acquire();
        holder = Thread.currentThread();

    }

    public synchronized void release()
    {   
        this.lock.release();
        holder = null;
    }
}

holder变量用于我不确定需要的函数:

public synchronized void conditionalRelease()
{
    if (holder == Thread.currentThread())
    {
        holder = null;
        this.lock.release();
    }
}

该程序编译并运行,但似乎在释放筷子时遇到一些麻烦.有时,筷子会被释放,有时则不会.当他们不释放时,当所有的筷子被拿走并且一个哲学家饿了时,程序最终会挂断.

这是Philosopher类中的代码,用于在随机的时间之后释放筷子:

System.out.println(this.name + " is eating");
Thread.sleep(this.getRandTime());
System.out.println(this.name + " has finished eating");

rightChopstick.release();
System.out.println(this.name + " has released the right chopstick");
leftChopstick.release();
System.out.println(this.name + " has released the left chopstick");

例如,我的程序输出"Philosopher 0吃完了",并继续执行.其他两行从不输出,所以我发布的方式显然有些不对劲.

任何帮助表示赞赏.



1> Outlaw Progr..:

我会从你的方法签名中取出'synchronized'关键字.您正在使用外部锁定机制(在本例中为信号量).'synchronized'关键字试图使用对象自己的互斥锁来获取锁.您现在锁定了2个我怀疑可能导致死锁的资源.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有