写法和标程一样
很经典的信号量应用。
用信号量可以限制进入的人数,从而规避死锁。
信号量初始值的选用对性能的影响是这道题的精华所在。
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.Semaphore;
class DiningPhilosophers {
private final ReentrantLock[] ForkList = {new ReentrantLock(),new ReentrantLock(),new ReentrantLock(),new ReentrantLock(),new ReentrantLock()};//0,1,2,3,4
private Semaphore phi = new Semaphore(4);
public DiningPhilosophers() {
}
// call the run() method of any runnable to execute its code
public void wantsToEat(int philosopher,
Runnable pickLeftFork,
Runnable pickRightFork,
Runnable eat,
Runnable putLeftFork,
Runnable putRightFork) throws InterruptedException {
int leftFork = (philosopher+4)%5;
int rightFork = philosopher;
phi.acquire();
ForkList[leftFork].lock();
ForkList[rightFork].lock();
pickLeftFork.run();
pickRightFork.run();
eat.run();
putLeftFork.run();
putRightFork.run();
ForkList[leftFork].unlock();
ForkList[rightFork].unlock();
phi.release();
}
}