Tengo un problema con el semáforo. Escribiendo un código donde hay 4 habitaciones y algunos visitantes. Cada habitación tiene un cierto límite para la cantidad de visitantes que pueden albergar. Por lo tanto, ingresar a una sala llena provocaría una espera(). Los visitantes no deben salir de una habitación antes de poder ingresar a otra, por lo que siempre están en una habitación.Punto muerto del semáforo
public class Semaphore {
private int placesLeft;
public Semaphore(int placesInRoom) {
this.placesLeft = placesInRoom;
}
public synchronized void acquire(Visitor visitor) {
Semaphore sem = visitor.getRoom().getSemaphore();
try {
while (placesLeft <= 0) {
this.wait();
}
} catch (InterruptedException e) {}
sem.release();
placesLeft--;
}
public synchronized void release() {
placesLeft++;
this.notifyAll();
}
Deadlock aparece cuando 2 personas intentan entrar en las habitaciones de los demás. También por alguna razón, el conteo placesLeft
no está saliendo bien.
¿Qué debo hacer?
EDIT:
estado ocupado con otra cosa, la reactivación de la cuestión. El problema no ocurre porque las salas se llenan, se bloquea cuando la persona1 de la habitación1 quiere entrar en la habitación2 y al mismo tiempo la persona2 de la habitación2 quiere entrar en la habitación1. Como entiendo, ¿tiene algo que ver con la sincronización? Se atascan antes del lanzamiento, por lo que no se llama a la liberación. Como yo entiendo, una habitación no se puede llamar y liberar a la misma hora. Así que, básicamente, la liberación del semáforo Room1 no se puede llamar primo al mismo tiempo que se llama el accuire, ¿lo mismo para room2? Soy un codificador novato y la sincronización no es tan clara todavía. La eliminación de sincronizaciones de una u otra no parece funcionar (también está mal).
El punto muerto es un resultado lógico si ambas salas están llenas. –
Su "<= 0" es un síntoma de un error.El valor nunca debe estar por debajo de 0. Entonces "==" debería hacer. ¿Por qué estás pasando _room_ into acquire()? –
¿Se les debe permitir a dos visitantes intercambiar habitaciones, o el punto muerto es el resultado preferido en este caso? –