Semaphore 类

定义

计数信号灯。

[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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
继承
Semaphore
属性
实现

注解

计数信号灯。 从概念上讲,信号量维护一组许可证。 如有必要,每个 #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 不会保留任何同步锁,因为这样会阻止将项返回到池。 信号量封装限制对池的访问所需的同步,独立于维护池本身的一致性所需的任何同步。

初始化为 1 的信号灯,并且使用时最多只有一个可用许可证,可以充当互斥锁。 这通常称为 em>二进制信号灯</em>,因为它只有两种状态:一个<允许可用或零个可用许可证。 以这种方式使用时,二进制信号量具有 属性 (与许多 java.util.concurrent.locks.Lock 实现不同,) ,即 "lock"可由所有者以外的线程释放 (因为信号灯没有所有权概念) 。 这在某些专用上下文(例如死锁恢复)中非常有用。

此类的构造函数(可选)接受 <em>fairness</em> 参数。 如果设置为 false,则此类不保证线程获取允许的顺序。 具体而言, <允许使用 em>barging</em> ,也就是说,可以在一直在等待的线程之前为线程调用 #acquire 分配一个许可证 - 从逻辑上讲,新线程将自身置于等待线程的队列的头。 当公平设置为 true 时,信号灯会保证选择调用任何方法的 #acquire() acquire 线程,以按照先入先出的顺序处理这些方法的调用获得许可 (;FIFO) 。 请注意,FIFO 排序必然适用于这些方法中的特定内部执行点。 因此,一个线程可以先于另一个线程调用 acquire ,但到达另一个线程之后的排序点,同样,从 方法返回时也是如此。 另请注意,非时制 #tryAcquire() tryAcquire 方法不遵循公平性设置,但会获取任何可用的许可。

通常,用于控制资源访问的信号量应初始化为公平,以确保没有线程无法访问资源。 使用信号灯进行其他类型的同步控制时,非公平排序的吞吐量优势通常大于公平性注意事项。

此类还为 和 #release(int) release 一次提供多个许可的便捷方法#acquire(int) acquire。 这些方法通常比循环更有效和有效。 但是,它们不建立任何首选项顺序。 例如,如果线程 A 调用 s.acquire(3) 而线程 B 调用 s.acquire(2),并且两个允许变为可用,则无法保证线程 B 将获取它们,除非其获取首先出现且 Semaphore s 处于公平模式。

内存一致性影响:在成功“获取”方法(例如在另一个线程中)调用“release”方法之前,线程中的操作(例如release()<acquire()>,在之前发生的</i> 操作)。

在 1.5 中添加。

java.util.concurrent.SemaphoreJava 文档。

此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。

构造函数

Semaphore(Int32)

Semaphore使用给定数量的许可证和非对等公平性设置创建 。

Semaphore(Int32, Boolean)

Semaphore使用给定的许可证数和给定的公平性设置创建 。

Semaphore(IntPtr, JniHandleOwnership)

创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。

属性

Class

返回此 Object的运行时类。

(继承自 Object)
Handle

基础 Android 实例的句柄。

(继承自 Object)
HasQueuedThreads

查询是否有线程正在等待获取。

IsFair

true如果此信号灯的公平性设置为 true,则返回 。

JniIdentityHashCode

计数信号灯。

(继承自 Object)
JniPeerMembers

计数信号灯。

PeerReference

计数信号灯。

(继承自 Object)
QueuedThreads

返回一个集合,其中包含可能正在等待获取的线程。

QueueLength

返回等待获取的线程数的估计值。

ThresholdClass

此 API 支持 Mono for Android 基础结构,不应直接从代码使用。

ThresholdType

此 API 支持 Mono for Android 基础结构,不应直接从代码使用。

方法

Acquire()

从此信号灯获取许可证,在有信号灯可用或线程中断时阻止。

Acquire(Int32)

从此信号灯获取给定数量的许可证,直到所有信号灯都可用或线程中断中断。

AcquireUninterruptibly()

从此信号灯获取一个许可证,并阻止,直到有一个信号灯可用。

AcquireUninterruptibly(Int32)

从此信号灯获取给定数量的许可证,直到所有许可证都可用为止。

AvailablePermits()

返回此信号灯中可用的当前许可证数。

Clone()

创建并返回此对象的副本。

(继承自 Object)
Dispose()

计数信号灯。

(继承自 Object)
Dispose(Boolean)

计数信号灯。

(继承自 Object)
DrainPermits()

获取并返回立即可用的所有许可证,或者如果负面许可可用,则释放它们。

Equals(Object)

指示其他某个对象是否“等于”此对象。

(继承自 Object)
GetHashCode()

返回对象的哈希代码值。

(继承自 Object)
JavaFinalize()

当垃圾回收确定不再引用对象时,由对象上的垃圾回收器调用。

(继承自 Object)
Notify()

唤醒正在等待此对象的监视器的单个线程。

(继承自 Object)
NotifyAll()

唤醒正在等待此对象的监视器的所有线程。

(继承自 Object)
ReducePermits(Int32)

按指示的减少来收缩可用许可数。

Release()

释放许可证,将其返回到信号灯。

Release(Int32)

释放给定数量的许可证,并将其返回到信号灯。

SetHandle(IntPtr, JniHandleOwnership)

设置 Handle 属性。

(继承自 Object)
ToArray<T>()

计数信号灯。

(继承自 Object)
ToString()

返回对象的字符串表示形式。

(继承自 Object)
TryAcquire()

仅当一个信号灯在调用时可用时才从此信号灯获取许可证。

TryAcquire(Int32)

仅当调用时所有许可证都可用时,才从此信号灯获取给定数量的许可证。

TryAcquire(Int32, Int64, TimeUnit)

如果所有许可证在给定的等待时间内都可用,并且当前线程尚未中断 Thread#中断,则从此信号灯获取给定数量的许可证。

TryAcquire(Int64, TimeUnit)

如果一个信号灯在给定的等待时间内可用,并且当前线程尚未中断 Thread#中断,则从此信号灯获取许可证。

UnregisterFromRuntime()

计数信号灯。

(继承自 Object)
Wait()

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<>

(继承自 Object)
Wait(Int64)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)
Wait(Int64, Int32)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)

显式接口实现

IJavaPeerable.Disposed()

计数信号灯。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

计数信号灯。

(继承自 Object)
IJavaPeerable.Finalized()

计数信号灯。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

计数信号灯。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

计数信号灯。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

计数信号灯。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

计数信号灯。

(继承自 Object)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

计数信号灯。

GetJniTypeName(IJavaPeerable)

计数信号灯。

适用于