/**
 * Implementación de un Semáforo General Contador heredando de SemaforoBinario.
 * Utiliza los monitores intrínsecos de Java (wait() y notify()).
 */
public class SemaforoGeneral extends SemaforoBinario {

    public SemaforoGeneral(int valorInicial) {
        super(valorInicial > 0 ? 1 : 0);
        this.contador = Math.max(0, valorInicial);
    }

    @Override
    public synchronized void acquire() {
        while (contador == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
        }
        contador--;
    }

    @Override
    public synchronized void release() {
        contador++;
        notify();
    }
}
