7. Что такое семафор? Как он реализован в Java?

7. Что такое семафор? Как он реализован в Java?

UNKNOWN

Semaphore – это новый тип синхронизатора: семафор со счётчиком, реализующий шаблон  синхронизации  Семафор.  Доступ  управляется  с  помощью  счётчика изначальное значение счётчика задаётся в конструкторе при создании синхронизатора, когда  поток  заходит  в  заданный  блок  кода,  то  значение  счётчика  уменьшается  на единицу, когда поток его покидает, то увеличивается. Если значение счётчика равно нулю, то текущий поток блокируется, пока кто-нибудь не выйдет из защищаемого блока.

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

Установить количество разрешений для доступа к ресурсу можно с помощью конструкторов класса Semaphore:

Semaphore(int permits)

Semaphore(int permits, boolean fair)

Параметр permits указывает на количество допустимых разрешений для доступа к ресурсу. Параметр fair во втором конструкторе позволяет установить очередность получения доступа. Если он равен true, то разрешения будут предоставляться ожидающим потокам в том порядке, в каком они запрашивали доступ. Если же он равен false, то разрешения будут предоставляться в неопределенном порядке.

Для получения разрешения у семафора надо вызвать метод acquire(), который имеет две формы:

void acquire() throws InterruptedException

void acquire(int permits) throws InterruptedВxception

Для получения одного разрешения применяется первый вариант, а для получения нескольких разрешений - второй вариант.

После вызова этого метода пока поток не получит разрешение, он блокируется.

После окончания работы с ресурсом полученное ранее разрешение надо освободить с помощью метода release():

void release()

void release(int permits)

Первый вариант метода освобождает одно разрешение, а второй вариант - количество разрешений, указанных в permits.


Предыдущий вопрос: 6. В каких состояниях может находиться поток?

Следующий вопрос: 8. Что обозначает ключевое слово volatile? Почему операции над volatile переменными не атомарны?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне

Report Page