/**
 * Implementación de un Semáforo Binario mediante Monitores de Java.
 * 
 * Nota de diseño: En Java, el método Object.wait() es 'final', por lo que
 * las operaciones del semáforo se denominan convencionalmente acquire() y release()
 * (análogas a java.util.concurrent.Semaphore).
 */
public class SemaforoBinario {
    protected int contador = 0;

    public SemaforoBinario(int valorInicial) {
        if (valorInicial < 0 || valorInicial > 1) {
            throw new IllegalArgumentException("Un semáforo binario solo admite 0 o 1.");
        }
        this.contador = valorInicial;
    }

    public synchronized void acquire() {
        while (contador == 0) {
            try {
                wait(); // Suspende el hilo y libera el monitor intrínseco
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
        }
        contador--;
    }

    public synchronized void release() {
        contador = 1;
        notify(); // Notifica a un hilo en espera
    }

    public synchronized int getContador() {
        return contador;
    }
}
