Semaphore Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Sémaphore de comptage.
[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
- Héritage
- Attributs
- Implémente
Remarques
Sémaphore de comptage. Conceptuellement, un sémaphore conserve un ensemble de permis. Chaque #acquire bloc si nécessaire jusqu’à ce qu’un permis soit disponible, puis l’accepte. Chacun #release ajoute un permis, potentiellement la libération d’un acquéreur bloquant. Toutefois, aucun objet d’autorisation réel n’est utilisé ; le Semaphore juste maintient un nombre du nombre disponible et agit en conséquence.
Les sémaphores sont souvent utilisés pour limiter le nombre de threads que pour accéder à une ressource (physique ou logique). Par exemple, voici une classe qui utilise un sémaphore pour contrôler l’accès à un pool d’éléments :
{@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;
}
}}
Avant d’obtenir un élément, chaque thread doit obtenir un permis auprès du sémaphore, garantissant qu’un élément est disponible pour une utilisation. Une fois le thread terminé avec l’élément qu’il est retourné au pool et qu’un permis est retourné au sémaphore, ce qui permet à un autre thread d’acquérir cet élément. Notez qu’aucun verrou de synchronisation n’est conservé lorsqu’il #acquire est appelé, car cela empêcherait un élément d’être retourné au pool. Le sémaphore encapsule la synchronisation nécessaire pour restreindre l’accès au pool, séparément de toute synchronisation nécessaire pour maintenir la cohérence du pool lui-même.
Un sémaphore initialisé à un, qui est utilisé de telle sorte qu’il n’a qu’un seul permis disponible, peut servir de verrou d’exclusion mutuelle. Il s’agit plus couramment d’un <sémaphore>/em< binaire em>, car il n’a que deux états : un permis disponible ou zéro permis disponible. Lorsqu’il est utilisé de cette façon, le sémaphore binaire a la propriété (contrairement à de nombreuses java.util.concurrent.locks.Lock implémentations), que le " lock" peut être libéré par un thread autre que le propriétaire (car les sémaphores n’ont aucune notion de propriété). Cela peut être utile dans certains contextes spécialisés, tels que la récupération de blocage.
Le constructeur de cette classe accepte éventuellement un <paramètre em>fairness</em> . Lorsque la valeur est définie false, cette classe ne garantit pas l’ordre dans lequel les threads obtiennent des autorisations. En particulier, <le>barging</em> est autorisé, c’est-à-dire qu’un thread appelant #acquire peut être alloué un permis avant un thread qui attendait - logiquement le nouveau thread se place à la tête de la file d’attente des threads en attente. Lorsque l’équité est définie sur true, le sémaphore garantit que les threads appelant l’une des #acquire() acquire méthodes sont sélectionnées pour obtenir des permis dans l’ordre dans lequel leur appel de ces méthodes a été traité (premier in-first-out ; FIFO). Notez que l’ordre FIFO s’applique nécessairement à des points internes spécifiques d’exécution au sein de ces méthodes. Par conséquent, il est possible qu’un thread s’appelle acquire avant un autre, mais atteigne le point de classement après l’autre, et de la même façon lors du retour de la méthode. Notez également que les méthodes intempestives #tryAcquire() tryAcquire ne respectent pas le paramètre d’équité, mais acceptent les permis disponibles.
En règle générale, les sémaphores utilisés pour contrôler l’accès aux ressources doivent être initialisés comme justes pour s’assurer qu’aucun thread n’est privé d’accès à une ressource. Lorsque vous utilisez des sémaphores pour d’autres types de contrôle de synchronisation, les avantages du débit de l’ordre non équitable l’emportent souvent sur les considérations d’équité.
Cette classe fournit également des méthodes pratiques pour #acquire(int) acquire et #release(int) release plusieurs permis à la fois. Ces méthodes sont généralement plus efficaces et plus efficaces que les boucles. Toutefois, ils n’établissent aucun ordre de préférence. Par exemple, si le thread A appelle ) et que le thread B appelle s.acquire(3s.acquire(2), et que deux permis deviennent disponibles, il n’existe aucune garantie que le thread B les obtiendra, sauf si son acquisition est arrivée en premier et que le sémaphore s est en mode équitable.
Effets de cohérence de la mémoire : actions dans un thread avant d’appeler une méthode « release » telle que release()<i>happen-before</i> actions suivant une méthode « acquire » réussie, comme acquire() dans un autre thread.
Ajouté à la version 1.5.
Java documentation pour java.util.concurrent.Semaphore.
Les parties de cette page sont des modifications basées sur le travail créé et partagé par Android Open Source et utilisées en fonction des termes décrits dans la Creative Commons 2.5 Attribution License.
Constructeurs
| Nom | Description |
|---|---|
| Semaphore(Int32, Boolean) |
Crée un |
| Semaphore(Int32) |
Crée un |
| Semaphore(IntPtr, JniHandleOwnership) |
Constructeur utilisé lors de la création de représentations managées d’objets JNI ; appelée par le runtime. |
Propriétés
| Nom | Description |
|---|---|
| Class |
Retourne la classe runtime de ce |
| Handle |
Handle de l’instance Android sous-jacente. (Hérité de Object) |
| HasQueuedThreads |
Interroge si des threads attendent d’acquérir. |
| IsFair |
Retourne |
| JniIdentityHashCode |
Obtient le code de hachage d’identité affecté à cet homologue Java par le runtime d’interopérabilité. (Hérité de Object) |
| JniManagedPeerState |
Sémaphore de comptage. (Hérité de JavaObject) |
| JniPeerMembers |
Sémaphore de comptage. |
| PeerReference |
Obtient la référence d’objet JNI pour cet homologue Java. (Hérité de Object) |
| QueuedThreads |
Retourne une collection contenant des threads qui peuvent attendre l’acquisition. |
| QueueLength |
Retourne une estimation du nombre de threads en attente d’acquisition. |
| ThresholdClass |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
| ThresholdType |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
Méthodes
| Nom | Description |
|---|---|
| Acquire() |
Acquiert un permis à partir de ce sémaphore, bloquant jusqu’à ce qu’un thread soit disponible ou que le thread soit interrompu par thread#interruption. |
| Acquire(Int32) |
Acquiert le nombre donné de permis à partir de ce sémaphore, bloquant jusqu’à ce que tous soient disponibles ou que le thread soit interrompu par thread#interruption. |
| AcquireUninterruptibly() |
Acquiert un permis de ce sémaphore, bloquant jusqu’à ce qu’il soit disponible. |
| AcquireUninterruptibly(Int32) |
Acquiert le nombre donné de permis de ce sémaphore, bloquant jusqu’à ce que tous soient disponibles. |
| AvailablePermits() |
Retourne le nombre actuel de permis disponibles dans ce sémaphore. |
| Clone() |
Crée et retourne une copie de cet objet. (Hérité de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Sémaphore de comptage. (Hérité de JavaObject) |
| Dispose() |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| Dispose(Boolean) |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| DisposeUnlessReferenced() |
Sémaphore de comptage. (Hérité de JavaObject) |
| DrainPermits() |
Acquiert et retourne tous les permis immédiatement disponibles, ou si des permis négatifs sont disponibles, les libère. |
| Equals(Object) |
Sémaphore de comptage. (Hérité de JavaObject) |
| Equals(Object) |
Indique si un autre objet est « égal à » celui-ci. (Hérité de Object) |
| GetHashCode() |
Retourne une valeur de code de hachage pour l’objet. (Hérité de Object) |
| JavaFinalize() |
Appelé par le garbage collector sur un objet lorsque le garbage collection détermine qu’il n’y a plus de références à l’objet. (Hérité de Object) |
| Notify() |
Réveille un thread unique qui attend le moniteur de cet objet. (Hérité de Object) |
| NotifyAll() |
Réveille tous les threads qui attendent le moniteur de cet objet. (Hérité de Object) |
| ReducePermits(Int32) |
Réduit le nombre de permis disponibles par la réduction indiquée. |
| Release() |
Libère un permis, le retournant au sémaphore. |
| Release(Int32) |
Libère le nombre donné de permis, les retournant au sémaphore. |
| SetHandle(IntPtr, JniHandleOwnership) |
Définit la propriété Handle. (Hérité de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Sémaphore de comptage. (Hérité de JavaObject) |
| ToArray<T>() |
Crée un tableau managé à partir de ce wrapper de tableau Java. (Hérité de Object) |
| ToString() |
Retourne une représentation sous forme de chaîne de l’objet. (Hérité de Object) |
| TryAcquire() |
Acquiert un permis à partir de ce sémaphore, seulement si un est disponible au moment de l’appel. |
| TryAcquire(Int32, Int64, TimeUnit) |
Acquiert le nombre donné de permis à partir de ce sémaphore, si tous deviennent disponibles dans le délai d’attente donné et que le thread actuel n’a pas été interrompu thread#interruption. |
| TryAcquire(Int32) |
Acquiert le nombre donné de permis de ce sémaphore, uniquement si tous sont disponibles au moment de l’appel. |
| TryAcquire(Int64, TimeUnit) |
Acquiert un permis à partir de ce sémaphore, si l’on devient disponible dans le délai d’attente donné et que le thread actuel n’a pas été interrompu thread#interruption. |
| UnregisterFromRuntime() |
Annule l’inscription de cet homologue Java à partir du runtime d’interopérabilité. (Hérité de Object) |
| Wait() |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti par em ou><em>interrompu</em>.<> (Hérité de Object) |
| Wait(Int64, Int32) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
| Wait(Int64) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| IJavaPeerable.Disposed() |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.Finalized() |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Sémaphore de comptage. (Hérité de JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Sémaphore de comptage. |
Méthodes d’extension
| Nom | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtient le nom JNI du type de l’instance |
| JavaAs<TResult>(IJavaPeerable) |
Essayez de forcer |
| JavaCast<TResult>(IJavaObject) |
Effectue une conversion de type vérifiée par le runtime Android. |
| JavaCast<TResult>(IJavaObject) |
Sémaphore de comptage. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Essayez de forcer |