Semaphore 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
计数信号灯。
[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
- 继承
- 属性
- 实现
注解
计数信号灯。 从概念上讲,信号量维护一组许可证。 如有必要,每个 #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.Semaphore
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
Semaphore(Int32) |
|
Semaphore(Int32, Boolean) |
|
Semaphore(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
HasQueuedThreads |
查询是否有线程正在等待获取。 |
IsFair |
|
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) |
计数信号灯。 |