3

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

そして私の哲学クラス:

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

}

もっとあるべきだと感じます..コード。しかし、私はプログラムを実行しましたが、問題が私に解決を求めていることを実行します。一度に食事をする哲学者は 2 人だけで、それ以外の場合は考えています。

私はこれの権利を持っていますか?

4

1 に答える 1

2

いいえ、このコードはデッドロックから安全ではありません。

5人の哲学者全員が左のフォークを獲得することが可能です。その後、それらはすべて、右のフォークを永遠に待ちます。

これを実証するために、簡単な を挿入するsleep()か、単に と のprintln()間に挿入するleftFork.lock()rightFork.lock()、ほとんどの場合失敗するはずです。現在のコードは、余分な遅延を引き起こさなくても、私のシステムで時々失敗します。

于 2012-10-28T01:38:55.487 に答える