Java 餐饮哲学家的实现

Java 餐饮哲学家的实现,java,Java,我只是想知道这是否就是用java解决哲学家进餐问题的全部 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MainClass { public static void main(String[] args) { Lock forks[] = new ReentrantLock[5]; for(int i = 0; i&l

我只是想知道这是否就是用java解决哲学家进餐问题的全部

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MainClass {

public static void main(String[] args) {
    Lock forks[] = new ReentrantLock[5];

    for(int i = 0; i<5; i++){
        forks[i] = new ReentrantLock(); 
    }

    Thread p1 = new Thread(new Philosopher(forks[4], forks[0], "first"));
    Thread p2 = new Thread(new Philosopher(forks[0], forks[1], "second"));
    Thread p3 = new Thread(new Philosopher(forks[1], forks[2], "third"));
    Thread p4 = new Thread(new Philosopher(forks[2], forks[3], "fourth"));
    Thread p5 = new Thread(new Philosopher(forks[3], forks[4], "fifth"));

    p1.start();
    p2.start();
    p3.start();
    p4.start();
    p5.start(); 
  }
}
感觉应该有更多的..代码。但我已经运行了这个程序,它完成了问题要求我解决的问题。同一时间只有两位哲学家在吃饭,另一方面他们在思考


我有这个权利吗

否,此代码不能避免死锁

所有5位哲学家都有可能获得他们的左叉子;他们将永远等待他们的右叉子


要演示这一点,请在
leftFork.lock()
rightFork.lock()
之间插入一个简短的
sleep()
,甚至只插入一个
println()
,这将使它大部分时间失败。当前代码在我的系统上偶尔会失败,即使没有额外的延迟。

这应该迁移到
codereview.stackexchange.com
。奇怪的是,我尝试将sleep和println放在两个lock()调用之间,但仍然有效。根据您的系统,可能更难引发问题。我在一个6核的CPU上运行它,这可能会让它变得更加明显。你能给我一些建议,如何避免死锁,不管CPU是什么吗?你可以看看
ReentrantLock.tryLock(timeout,unit)
方法,也就是说,如果哲学家在有限的时间内不能得到第二个叉子,他就会放弃他的一个叉子。好的,太棒了,我会调查的谢谢!!
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Philosopher implements Runnable {

Lock leftFork = new ReentrantLock();
Lock rightFork = new ReentrantLock();
String name; 

public Philosopher(Lock leftFork, Lock rightFork, String name) {
    this.leftFork = leftFork;
    this.rightFork = rightFork;
    this.name = name; 
}

@Override
public void run() {

    while(true){
    think(name);
    eat(leftFork, rightFork, name); 
    }
}

private void eat(Lock leftFork, Lock rightFork, String name){
    leftFork.lock();
    rightFork.lock(); 

    System.out.println(name + " eating...");

    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    finally{
        leftFork.unlock();
        rightFork.unlock(); 
        System.out.println(name + " done eating...");
    }
}

private void think(String name){
    System.out.println(name + " thinking...");

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}

}