2016-11-21 3 views
1

Я хочу решить проблемы с философами столовой с помощью семафоров Java, но я застрял. Самая высокая идентификационная палочка должна быть доступна, но она, кажется, всегда принимается, и я не знаю, почему. Может ли кто-нибудь сказать мне, где я ошибся?Обеденные философы в java с помощью семафоров

Вилка Класс:

class Fork { 
public static Semaphore fork = new Semaphore(1); 
public int id; 

Fork(int id) { 
    this.id = id; 
} 

public int getId() { 
    return id; 
} 

public boolean take() { 
    return fork.tryAcquire(); 
} 

public void putDown() { 
    fork.release(); 
}} 

Философ класс:

class Philosopher extends Thread { 

private Fork fork_low; 
private Fork fork_high; 
private String name; 

Philosopher(Fork fork_low, Fork fork_high, String name) { 
    this.fork_low = fork_low; 
    this.fork_high = fork_high; 
    this.name = name; 
} 

public void run() { 

    try { 
     sleep(1000); 
    } catch (InterruptedException ex) { 
    } 

    while (true) { 
     eat(); 
    } 
} 

private void eat(){ 
    if(fork_low.take()){ 
     if(fork_high.take()){ 
      try { 
       sleep(2000); // eating; 
      } catch (InterruptedException ex) { } 

      fork_high.putDown(); 
      fork_low.putDown(); 

     } 
     else{ 
      fork_low.putDown(); 
     } 
    } 
}} 

Главная:

public static void main(String[] args) { 
    String[] names = {"Plato", "Aristotle", "Cicero", "Confucius", "Eratosthenes"}; 
    Fork[] fork = new Fork[5]; 
    Philosopher[] philosopher = new Philosopher[5]; 

    for (int i = 0; i < fork.length; i++) { 
     fork[i] = new Fork(i); 
    } 

    for (int i = 0; i < philosopher.length; i++) { 

     if (i != philosopher.length - 1) { 
      philosopher[i] = new Philosopher(fork[i], fork[i+1], names[i]); 
      philosopher[i].start(); 
     } else { 
      philosopher[i] = new Philosopher(fork[0], fork[i], names[i]); 
      philosopher[i].start(); 
     } 
    } 
} 

ответ

2

У вас есть де adlock, потому что Семафор статичен в классе Fork, что эквивалентно наличию только одной вилки. Он отлично работает, когда вы делаете Семафор не статичным (2 случайных философа работают одновременно).

Вы можете наблюдать за вашими нитями, работающими в сборке JDK в инструменте jvisualvm.

+0

yup, отлично работает, спасибо. –