Язык

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 Создает с заданным числом разрешений и заданным параметром справедливости.

Semaphore(Int32)

Semaphore Создает значение с заданным количеством разрешений и параметрами справедливости, не относящихся к ней.

Semaphore(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Свойства

Имя. Описание
Class

Возвращает класс среды выполнения этого Objectобъекта.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
HasQueuedThreads

Запрашивает, ожидают ли какие-либо потоки получения.

IsFair

Возвращает, true если этот семафор имеет значение true.

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 типа экземпляра self.

JavaAs<TResult>(IJavaPeerable)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Подсчет семафора.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

Применяется к