Estoy tratando de aprender el jist básico de un semáforo en el problema del filósofo gastronómico. En este momento, tengo una serie de palillos de clase, y cada Palillo tiene un semáforo con 1 permiso disponibles:Problemas de semáforo en Java con los filósofos del comedor
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;
}
}
La variable de soporte, utilice una función que no estoy seguro de que necesito:
public synchronized void conditionalRelease()
{
if (holder == Thread.currentThread())
{
holder = null;
this.lock.release();
}
}
El programa se compila y se ejecuta, pero parece tener algunos problemas para liberar los palillos. A veces, los palillos se liberan, a veces no lo hacen. Cuando no se liberan, el programa finalmente cuelga cuando se toman todos los palillos y un filósofo está hambriento.
Este es el código dentro de la clase Filósofo para liberar el palillo después de un periodo de tiempo aleatorio:
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");
Mi programa lo hace la salida "0 Filósofo ha terminado de comer", por ejemplo, y continúa la ejecución. Las otras dos líneas nunca salen, entonces obviamente algo está mal con la forma en que estoy liberando.
Cualquier ayuda es apreciada.
Ja! Eso es exactamente lo que era ... tuve que implementar estas dos formas diferentes para una tarea y copié el código pegado para el primer método y olvidé eliminar la palabra clave sincronizada. Buen hallazgo –