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 将获取它们,除非其获取第一个,信号灯 s 处于公平模式。

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

在 1.5 中添加。

适用于 . 的 java.util.concurrent.SemaphoreJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

名称 说明
Semaphore(Int32, Boolean)

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

Semaphore(Int32)

创建 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()

从此信号灯获取许可证,直到有一个信号灯可用,或者线程被 Thread#中断中断。

Acquire(Int32)

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

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, Int64, TimeUnit)

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

TryAcquire(Int32)

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

TryAcquire(Int64, TimeUnit)

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

UnregisterFromRuntime()

计数信号灯。

(继承自 Object)
Wait()

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

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

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

(继承自 Object)
Wait(Int64)

使当前线程等待直到唤醒,通常是通过 <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)

扩展方法

名称 说明
GetJniTypeName(IJavaPeerable)

获取实例 self类型的 JNI 名称。

JavaAs<TResult>(IJavaPeerable)

尝试强制self键入TResult,检查强制是否在Java端有效。

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

计数信号灯。

TryJavaCast<TResult>(IJavaPeerable, TResult)

尝试强制self键入TResult,检查强制是否在Java端有效。

适用于