Использование семафора для контроля количества потоков - PullRequest
0 голосов
/ 11 марта 2011

Как я могу использовать класс Semaphore для управления количеством потоков, имеющих доступ к объекту?

Ответы [ 5 ]

4 голосов
/ 11 марта 2011
  • Инициализировать семафор с максимальным количеством допустимых толщ,
  • уменьшить счетчик семафоров на единицу, если поток входит в ограниченную область
  • увеличить счетчик семафоров на единицу, если поток покидает ограниченную область
2 голосов
/ 19 сентября 2012

Еще одна полезная вещь об использовании семафора для управления доступом к ресурсам - вы можете изменить его размер во время выполнения.Например, у вас может быть некоторый случай использования, когда вы хотите, чтобы большее количество пользователей получало доступ к ресурсу на основе некоторой бизнес-логики, а затем снова уменьшали его.Пример кода для большого семафора

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;
    }   
}
0 голосов
/ 11 марта 2011

Возможно, вы могли бы прочитать ответ на этот вопрос и взглянуть на этот пример

0 голосов
/ 11 марта 2011

Просто используйте:

java.util.concurrent.Semaphore

есть обширный пример того, как использовать его в javadoc:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html

0 голосов
/ 11 марта 2011

Это отличный пример того, как Семафор может использоваться для ограничения одновременного доступа к объекту:

http://technicalmumbojumbo.wordpress.com/2010/02/21/java-util-concurrent-java-5-semaphore/

Ключевые моменты:

  • Когда вы создаете семафор, вы можете объявить максимальный параллелизм (то есть количество потоков, которым разрешен одновременный доступ)
  • Вам требуется, чтобы каждый поток пытался приобрести () Семафор; пусть семафор отслеживает одновременный доступ
...