Семафор и синхронизация - PullRequest
       14

Семафор и синхронизация

12 голосов
/ 15 октября 2010

Я не вполне мог понять следующее из описания семафора в javadocs.

Обратите внимание, что блокировка синхронизации не удерживается при вызове acqu (), поскольку это препятствует возврату элемента вбассейн. Семафор инкапсулирует синхронизацию, необходимую для ограничения доступа к пулу, отдельно от любой синхронизации, необходимой для поддержания согласованности самого пула.

Может кто-нибудь помочь мне понять это иего последствия.

1 Ответ

12 голосов
/ 15 октября 2010

Семафор действует как ограничитель доступной глубины пула ресурсов; Например, семафор с емкостью 10 позволяет получить его максимум 10 потокам одновременно, и любые последующие потоки, которые пытаются получить его, будут блокироваться, пока один из других потоков не освободит его.

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

Рассмотрим, например, пул соединений с ограничением в 10 соединений. Каждый поток, которому требуется соединение, получит семафор на время его использования соединения (что предотвращает слишком много потоков, запрашивающих соединения одновременно), но объект пула должен также использовать синхронизированные блоки или методы при извлечении соединений из его внутреннего собирать или помещать их обратно, чтобы предотвратить такие вещи, как потеря соединения или ошибочная передача одного и того же соединения двум разным потокам, потому что они спрашивают одновременно.

...