Semaphore Clase

Definición

Semáforo de recuento.

[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
Herencia
Atributos
Implementaciones

Comentarios

Semáforo de recuento. Conceptualmente, un semáforo mantiene un conjunto de permisos. Cada #acquire bloque se bloquea si es necesario hasta que haya un permiso disponible y luego lo toma. Cada #release uno agrega un permiso, lo que podría liberar un adquiridor de bloqueo. Sin embargo, no se utilizan objetos de permiso reales; simplemente Semaphore mantiene un recuento del número disponible y actúa en consecuencia.

Los semáforos se usan a menudo para restringir el número de subprocesos que pueden tener acceso a algunos recursos (físicos o lógicos). Por ejemplo, esta es una clase que usa un semáforo para controlar el acceso a un grupo de elementos:

{@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;
              }
            }}

Antes de obtener un elemento, cada subproceso debe adquirir un permiso del semáforo, garantizando que un elemento está disponible para su uso. Cuando el subproceso ha terminado con el elemento, se devuelve al grupo y se devuelve un permiso al semáforo, lo que permite que otro subproceso adquiera ese elemento. Tenga en cuenta que no se mantiene ningún bloqueo de sincronización cuando #acquire se llama a , ya que impediría que se devuelva un elemento al grupo. El semáforo encapsula la sincronización necesaria para restringir el acceso al grupo, independientemente de cualquier sincronización necesaria para mantener la coherencia del propio grupo.

Un semáforo inicializado en uno, y que se usa para que solo tenga al máximo un permiso disponible, puede servir como bloqueo de exclusión mutua. Esto se conoce más comúnmente como semáforo <binario em><>, ya que solo tiene dos estados: un permiso disponible o cero permisos disponibles. Cuando se usa de esta manera, el semáforo binario tiene la propiedad (a diferencia de muchas java.util.concurrent.locks.Lock implementaciones), que el " lock" puede ser liberado por un subproceso distinto del propietario (ya que los semáforos no tienen ninguna noción de propiedad). Esto puede ser útil en algunos contextos especializados, como la recuperación de interbloqueos.

El constructor de esta clase acepta opcionalmente un <parámetro em>fairness</em> . Cuando se establece false, esta clase no garantiza el orden en que los subprocesos adquieren permisos. En concreto, <se permite em>barging</em> , es decir, se puede asignar un permiso de invocación #acquire de subprocesos antes de un subproceso que ha estado esperando; lógicamente, el nuevo subproceso se coloca en la cabeza de la cola de subprocesos en espera. Cuando se establece la equidad, el semáforo garantiza que los subprocesos que invocan cualquiera de los #acquire() acquire métodos se seleccionan para obtener permisos en el orden en que se procesó su invocación de esos métodos (primero en salir; FIFO). Tenga en cuenta que la ordenación fiFO se aplica necesariamente a puntos internos específicos de ejecución dentro de estos métodos. Por lo tanto, es posible que un subproceso invoque acquire antes de otro, pero alcance el punto de ordenación después del otro y, de forma similar, tras la devolución del método . Tenga en cuenta también que los métodos notimen #tryAcquire() tryAcquire no respetan la configuración de equidad, pero tomarán los permisos que estén disponibles.

Por lo general, los semáforos que se usan para controlar el acceso a los recursos deben inicializarse como justos, para asegurarse de que no hay ningún subproceso agotado para acceder a un recurso. Al usar semáforos para otros tipos de control de sincronización, las ventajas de rendimiento de la ordenación no justa suelen superar las consideraciones de equidad.

Esta clase también proporciona métodos útiles para #acquire(int) acquire y #release(int) release varios permisos a la vez. Estos métodos suelen ser más eficaces y eficaces que los bucles. Sin embargo, no establecen ningún orden de preferencia. Por ejemplo, si el subproceso s.acquire(3A invoca ) y el subproceso B invoca s.acquire(2), y dos permisos están disponibles, no hay ninguna garantía de que el subproceso B los obtenga a menos que su adquisición llegue primero y Semaphore s esté en modo justo.

Efectos de coherencia de memoria: acciones en un subproceso antes de llamar a un método "release", como release()<las acciones de i>happen-before</i> después de un método "acquire" correcto, como acquire() en otro subproceso.

Agregado en 1.5.

Java documentación para java.util.concurrent.Semaphore.

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.

Constructores

Nombre Description
Semaphore(Int32, Boolean)

Crea un Semaphore objeto con el número especificado de permisos y la configuración de equidad dada.

Semaphore(Int32)

Crea un Semaphore objeto con el número determinado de permisos y una configuración de equidad no feriada.

Semaphore(IntPtr, JniHandleOwnership)

Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el tiempo de ejecución.

Propiedades

Nombre Description
Class

Devuelve la clase en tiempo de ejecución de este Objectobjeto .

(Heredado de Object)
Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
HasQueuedThreads

Consulta si algún subproceso está esperando adquirir.

IsFair

Devuelve true si este semáforo tiene la equidad establecida en true.

JniIdentityHashCode

Obtiene el código hash de identidad asignado a este Java del mismo nivel por el tiempo de ejecución de interoperabilidad.

(Heredado de Object)
JniManagedPeerState

Semáforo de recuento.

(Heredado de JavaObject)
JniPeerMembers

Semáforo de recuento.

PeerReference

Obtiene la referencia de objeto JNI para este Java del mismo nivel.

(Heredado de Object)
QueuedThreads

Devuelve una colección que contiene subprocesos que pueden estar esperando adquirir.

QueueLength

Devuelve una estimación del número de subprocesos a la espera de adquirir.

ThresholdClass

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

ThresholdType

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

Métodos

Nombre Description
Acquire()

Adquiere un permiso de este semáforo, bloqueando hasta que uno esté disponible o el subproceso es Thread#interrupt interrumpida.

Acquire(Int32)

Adquiere el número determinado de permisos de este semáforo, el bloqueo hasta que todos están disponibles o el subproceso es Thread#interrupt interrumpida.

AcquireUninterruptibly()

Adquiere un permiso de este semáforo, bloqueando hasta que uno esté disponible.

AcquireUninterruptibly(Int32)

Adquiere el número determinado de permisos de este semáforo, bloqueando hasta que todos estén disponibles.

AvailablePermits()

Devuelve el número actual de permisos disponibles en este semáforo.

Clone()

Crea y devuelve una copia de este objeto.

(Heredado de Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Semáforo de recuento.

(Heredado de JavaObject)
Dispose()

Libera los recursos mantenidos por este Java del mismo nivel.

(Heredado de Object)
Dispose(Boolean)

Libera los recursos mantenidos por este Java del mismo nivel.

(Heredado de Object)
DisposeUnlessReferenced()

Semáforo de recuento.

(Heredado de JavaObject)
DrainPermits()

Adquiere y devuelve todos los permisos que están disponibles inmediatamente, o si están disponibles los permisos negativos, los libera.

Equals(Object)

Semáforo de recuento.

(Heredado de JavaObject)
Equals(Object)

Indica si algún otro objeto es "igual a" este.

(Heredado de Object)
GetHashCode()

Devuelve un valor de código hash del objeto.

(Heredado de Object)
JavaFinalize()

Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto .

(Heredado de Object)
Notify()

Activa un único subproceso que está esperando en el monitor de este objeto.

(Heredado de Object)
NotifyAll()

Activa todos los subprocesos que están esperando en el monitor de este objeto.

(Heredado de Object)
ReducePermits(Int32)

Reduce el número de permisos disponibles por la reducción indicada.

Release()

Libera un permiso, devolvándolo al semáforo.

Release(Int32)

Libera el número determinado de permisos, devolviéndolos al semáforo.

SetHandle(IntPtr, JniHandleOwnership)

Establece la propiedad Handle.

(Heredado de Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Semáforo de recuento.

(Heredado de JavaObject)
ToArray<T>()

Crea una matriz administrada a partir de este contenedor de matriz Java.

(Heredado de Object)
ToString()

Devuelve una representación de cadena del objeto.

(Heredado de Object)
TryAcquire()

Adquiere un permiso de este semáforo, solo si hay uno disponible en el momento de la invocación.

TryAcquire(Int32, Int64, TimeUnit)

Adquiere el número determinado de permisos de este semáforo, si todos están disponibles en el tiempo de espera especificado y el subproceso actual no se ha interrumpido la interrupción de Thread#.

TryAcquire(Int32)

Adquiere el número determinado de permisos de este semáforo, solo si todos están disponibles en el momento de la invocación.

TryAcquire(Int64, TimeUnit)

Adquiere un permiso de este semáforo, si uno está disponible dentro del tiempo de espera dado y el subproceso actual no se ha interrumpido la interrupción de Thread#.

UnregisterFromRuntime()

Anula el registro de este Java del mismo nivel del tiempo de ejecución de interoperabilidad.

(Heredado de Object)
Wait()

Hace que el subproceso actual espere hasta que se despierta, normalmente por ser em notificado/em< o >em<interrumpido>/em<.><>

(Heredado de Object)
Wait(Int64, Int32)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
Wait(Int64)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)

Implementaciones de interfaz explícitas

Nombre Description
IJavaPeerable.Disposed()

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.Finalized()

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Semáforo de recuento.

(Heredado de JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Semáforo de recuento.

Métodos de extensión

Nombre Description
GetJniTypeName(IJavaPeerable)

Obtiene el nombre JNI del tipo de la instancia self.

JavaAs<TResult>(IJavaPeerable)

Intente coerción self para escribir TResult, comprobando que la coerción es válida en el lado de Java.

JavaCast<TResult>(IJavaObject)

Realiza una conversión de tipos comprobados en tiempo de ejecución de Android.

JavaCast<TResult>(IJavaObject)

Semáforo de recuento.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Intente coerción self para escribir TResult, comprobando que la coerción es válida en el lado de Java.

Se aplica a