Еще одна полезная вещь об использовании семафора для управления доступом к ресурсам - вы можете изменить его размер во время выполнения.Например, у вас может быть некоторый случай использования, когда вы хотите, чтобы большее количество пользователей получало доступ к ресурсу на основе некоторой бизнес-логики, а затем снова уменьшали его.Пример кода для большого семафора
public class ResizeableSemaphore extends Semaphore
{
private static final long serialVersionUID = 1L;
private int permit;
public ResizeableSemaphore(int permit) {
super(permit);
this.permit=permit;
}
public synchronized void resizeIfRequired(int newPermit)
{
int delta = newPermit - permit;
if(delta==0) return;
if(delta > permit) this.release(delta); // this will increase capacity
if(delta < 0) this.reducePermits(Math.abs(delta));
this.permit=newPermit;
}
}