Semaphore Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Подсчет семафора.
[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)>]
type Semaphore = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Наследование
- Атрибуты
- Реализации
Комментарии
Подсчет семафора. Концептуально семафор поддерживает набор разрешений. Каждый #acquire блок при необходимости, пока не будет доступен разрешение, а затем принимает его. Каждый #release добавляет разрешение, потенциально освобождая блокирующий приобретатель. Однако фактические объекты разрешений не используются; только Semaphore что сохраняет количество доступных и действует соответствующим образом.
Семафоры часто используются для ограничения количества потоков, чем может получить доступ к некоторым (физическим или логическим) ресурсам. Например, вот класс, использующий семафор для управления доступом к пулу элементов:
{@code
class Pool {
private static final int MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}
// Not a particularly efficient data structure; just for demo
protected Object[] items = ...; // whatever kinds of items being managed
protected boolean[] used = new boolean[MAX_AVAILABLE];
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null; // not reached
}
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}
}}
Перед получением элемента каждый поток должен получить разрешение от семафора, гарантируя, что элемент доступен для использования. Когда поток завершит работу с элементом, который возвращается обратно в пул, и разрешение возвращается в семафор, позволяя другому потоку получить этот элемент. Обратите внимание, что блокировка синхронизации не удерживается при #acquire вызове, так как это не позволит вернуть элемент в пул. Семафор инкапсулирует синхронизацию, необходимую для ограничения доступа к пулу, отдельно от любой синхронизации, необходимой для поддержания согласованности самого пула.
Семафор, инициализированный в один, и который используется таким образом, что он имеет только одно разрешение, может служить взаимной блокировкой исключения. Это чаще называется эм-двоичным <>семафор</em>, так как оно имеет только два состояния: одно разрешение доступно или ноль разрешений. При использовании таким образом двоичный семафор имеет свойство (в отличие от многих java.util.concurrent.locks.Lock реализаций), которое " lock" может быть освобожден потоком, кроме владельца (так как семафоры не имеют понятия владения). Это может быть полезно в некоторых специализированных контекстах, таких как восстановление взаимоблокировки.
Конструктор для этого класса при необходимости принимает <параметр em>fairness</em> . Если задано значение false, этот класс не гарантирует порядок получения разрешений потоками. В частности, <>допускается ли линейчатая полоса< или em>, то есть вызов потока #acquire может быть выделен разрешение перед потоком, ожидающим , логически новый поток помещается в голову очереди ожидающих потоков. Если задано значение true, семафор гарантирует, что потоки, вызывающие любой из #acquire() acquire методов, выбираются для получения разрешений в порядке их вызова этих методов (первый в первом выходе; FIFO). Обратите внимание, что порядок FIFO обязательно применяется к определенным внутренним точкам выполнения в этих методах. Таким образом, можно вызвать acquire один поток перед другим, но достичь точки упорядочения после другого и аналогично при возвращении из метода. Кроме того, обратите внимание, что незапланированные #tryAcquire() tryAcquire методы не учитывают параметры справедливости, но будут принимать любые разрешения, доступные.
Как правило, семафоры, используемые для управления доступом к ресурсам, должны быть инициализированы как справедливые, чтобы обеспечить отсутствие нехватки потока от доступа к ресурсу. При использовании семафоров для других видов управления синхронизацией преимущества пропускной способности несправедливого порядка часто перевешивают соображения справедливости.
Этот класс также предоставляет удобные методы и #acquire(int) acquire#release(int) release несколько разрешений одновременно. Как правило, эти методы являются более эффективными и эффективными, чем циклы. Однако они не устанавливают порядок предпочтений. Например, если поток A вызывает s.acquire(3) и вызовы s.acquire(2)потока B и два разрешения становятся доступными, то нет никакой гарантии, что поток B получит их, если его получение не было первым, и Семафор s находится в справедливом режиме.
Эффекты согласованности памяти: действия в потоке перед вызовом метода "release", release()<например i>happen-before</i> , после успешного метода получения, например acquire() в другом потоке.
Добавлено в версии 1.5.
Java документации по java.util.concurrent.Semaphore.
Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".
Конструкторы
| Имя. | Описание |
|---|---|
| Semaphore(Int32, Boolean) |
|
| Semaphore(Int32) |
|
| Semaphore(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
| Имя. | Описание |
|---|---|
| Class |
Возвращает класс среды выполнения этого |
| Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
| HasQueuedThreads |
Запрашивает, ожидают ли какие-либо потоки получения. |
| IsFair |
Возвращает, |
| JniIdentityHashCode |
Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия. (Унаследовано от Object) |
| JniManagedPeerState |
Подсчет семафора. (Унаследовано от JavaObject) |
| JniPeerMembers |
Подсчет семафора. |
| PeerReference |
Возвращает ссылку на объект JNI для этого Java однорангового узла. (Унаследовано от Object) |
| QueuedThreads |
Возвращает коллекцию, содержащую потоки, которые могут ожидать получения. |
| QueueLength |
Возвращает оценку количества потоков, ожидающих получения. |
| ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
| ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
| Имя. | Описание |
|---|---|
| Acquire() |
Получает разрешение от этого семафора, блокируя до тех пор, пока он не будет доступен, или поток прерван потоком#прерывания. |
| Acquire(Int32) |
Получает заданное количество разрешений из этого семафора, блокируя до тех пор, пока все не будут доступны, или поток прерывается потоком#прерывания. |
| AcquireUninterruptibly() |
Получает разрешение от этого семафора, блокируя до тех пор, пока он не будет доступен. |
| AcquireUninterruptibly(Int32) |
Получает заданное количество разрешений от этого семафора, блокируя до тех пор, пока все не будут доступны. |
| AvailablePermits() |
Возвращает текущее количество разрешений, доступных в этом семафоре. |
| Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Подсчет семафора. (Унаследовано от JavaObject) |
| Dispose() |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| Dispose(Boolean) |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| DisposeUnlessReferenced() |
Подсчет семафора. (Унаследовано от JavaObject) |
| DrainPermits() |
Получает и возвращает все разрешения, которые сразу же доступны или если отрицательные разрешения доступны, освобождает их. |
| Equals(Object) |
Подсчет семафора. (Унаследовано от JavaObject) |
| Equals(Object) |
Указывает, равен ли другой объект этому объекту. (Унаследовано от Object) |
| GetHashCode() |
Возвращает хэш-значение кода для объекта. (Унаследовано от Object) |
| JavaFinalize() |
Устаревшие.
Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет. (Унаследовано от Object) |
| Notify() |
Просыпается один поток, ожидающий монитора этого объекта. (Унаследовано от Object) |
| NotifyAll() |
Просыпает все потоки, ожидающие монитора этого объекта. (Унаследовано от Object) |
| ReducePermits(Int32) |
Уменьшает количество доступных разрешений по указанному сокращению. |
| Release() |
Освобождает разрешение, возвращая его в семафор. |
| Release(Int32) |
Освобождает заданное количество разрешений, возвращая их в семафор. |
| SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Подсчет семафора. (Унаследовано от JavaObject) |
| ToArray<T>() |
Создает управляемый массив из этого Java оболочки массива. (Унаследовано от Object) |
| ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
| TryAcquire() |
Получает разрешение от этого семафора, только если он доступен во время вызова. |
| TryAcquire(Int32, Int64, TimeUnit) |
Получает заданное количество разрешений из этого семафора, если все становятся доступными в течение заданного времени ожидания, и текущий поток не был прерван потоком#прерывания. |
| TryAcquire(Int32) |
Получает заданное количество разрешений из этого семафора, только если все доступны во время вызова. |
| TryAcquire(Int64, TimeUnit) |
Получает разрешение от этого семафора, если он становится доступным в течение заданного времени ожидания, и текущий поток не был прерван потоком#прерывания. |
| UnregisterFromRuntime() |
Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия. (Унаследовано от Object) |
| Wait() |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, путем <><уведомления/>em или <эм>прерванного</em.> (Унаследовано от Object) |
| Wait(Int64, Int32) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
| Wait(Int64) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
| Имя. | Описание |
|---|---|
| IJavaPeerable.Disposed() |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.Finalized() |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Подсчет семафора. (Унаследовано от JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Подсчет семафора. |
Методы расширения
| Имя. | Описание |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Возвращает имя JNI типа экземпляра |
| JavaAs<TResult>(IJavaPeerable) |
Попробуйте принуждать к типу |
| JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
| JavaCast<TResult>(IJavaObject) |
Подсчет семафора. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Попробуйте принуждать к типу |