java.lang.Object
java.util.concurrent.locks.AbstractOwnableSynchronizer
java.util.concurrent.locks.AbstractQueuedLongSynchronizer
- 所有已实现的接口:
-
Serializable
public abstract class AbstractQueuedLongSynchronizer extends AbstractOwnableSynchronizer implements Serializable
一个版本的
AbstractQueuedSynchronizer
,其中同步状态以long
形式维护。该类与AbstractQueuedSynchronizer
具有完全相同的结构、属性和方法,唯一的区别是所有与状态相关的参数和结果都定义为long
而不是int
。当创建需要64位状态的同步器(如多级锁和屏障)时,此类可能很有用。
请参阅AbstractQueuedSynchronizer
以获取用法说明和示例。
- 自从:
- 1.6
- 另请参见:
-
Nested Class Summary
Modifier and TypeClassDescriptionclass
用作Lock
实现基础的AbstractQueuedLongSynchronizer
的条件实现。 -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionfinal void
acquire
(long arg) 以独占模式获取,忽略中断。final void
acquireInterruptibly
(long arg) 以独占模式获取,如果被中断则中止。final void
acquireShared
(long arg) 以共享模式获取,忽略中断。final void
acquireSharedInterruptibly
(long arg) 以共享模式获取,如果被中断则中止。protected final boolean
compareAndSetState
(long expect, long update) 如果当前状态值等于期望值,则将同步状态原子设置为给定的更新值。final Collection
<Thread> 返回一个包含可能正在等待以独占模式获取的线程的集合。final Thread
返回队列中第一个(等待时间最长)线程,如果当前没有线程在排队,则返回null
。final Collection
<Thread> 返回一个包含可能正在等待获取的线程的集合。final int
返回等待获取的线程数的估计值。final Collection
<Thread> 返回一个包含可能正在等待以共享模式获取的线程的集合。protected final long
getState()
返回同步状态的当前值。final Collection
<Thread> 返回一个包含可能正在等待与此同步器关联的给定条件的线程的集合。final int
返回等待与此同步器关联的给定条件的线程数的估计值。final boolean
查询是否有任何线程曾经争夺过获取此同步器;也就是说,是否曾经有获取方法被阻塞过。final boolean
查询是否有任何线程等待获取的时间比当前线程长。final boolean
查询是否有任何线程正在等待获取。final boolean
查询是否有任何线程正在等待与此同步器关联的给定条件。protected boolean
如果相对于当前(调用)线程独占地持有同步,则返回true
。final boolean
如果给定线程当前在队列中,则返回true
。final boolean
查询给定的ConditionObject是否将此同步器用作其锁。final boolean
release
(long arg) 以独占模式释放。final boolean
releaseShared
(long arg) 以共享模式释放。protected final void
setState
(long newState) 设置同步状态的值。toString()
返回标识此同步器及其状态的字符串。protected boolean
tryAcquire
(long arg) 尝试以独占模式获取。final boolean
tryAcquireNanos
(long arg, long nanosTimeout) 尝试以独占模式获取,如果被中断则中止,并且如果给定的超时时间过去则失败。protected long
tryAcquireShared
(long arg) 尝试以共享模式获取。final boolean
tryAcquireSharedNanos
(long arg, long nanosTimeout) 尝试以共享模式获取,如果被中断则中止,并且如果给定的超时时间过去则失败。protected boolean
tryRelease
(long arg) 尝试设置状态以反映以独占模式释放。protected boolean
tryReleaseShared
(long arg) 尝试设置状态以反映以共享模式释放。Methods declared in class java.util.concurrent.locks.AbstractOwnableSynchronizer
getExclusiveOwnerThread, setExclusiveOwnerThread
-
Constructor Details
-
AbstractQueuedLongSynchronizer
public AbstractQueuedLongSynchronizer()子类调用的构造函数。
-
-
Method Details
-
getState
protected final long getState()返回同步状态的当前值。此操作具有volatile
读取的内存语义。- 返回:
- 当前状态值
-
setState
protected final void setState(long newState) 设置同步状态的值。此操作具有volatile
写入的内存语义。- 参数:
-
newState
- 新状态值
-
compareAndSetState
protected final boolean compareAndSetState(long expect, long update) 如果当前状态值等于期望值,则将同步状态原子设置为给定的更新值。此操作具有volatile
读取和写入的内存语义。- 参数:
-
expect
- 期望值 -
update
- 新值 - 返回:
-
如果成功则返回
true
。返回false
表示实际值不等于期望值。
-
tryAcquire
protected boolean tryAcquire(long arg) 尝试以独占模式获取。此方法应查询对象的状态是否允许以独占模式获取,并在允许时获取。此方法始终由执行获取的线程调用。如果此方法报告失败,则获取方法可能会将线程排队,如果尚未排队,则直到被其他线程的释放信号唤醒。这可用于实现方法
Lock.tryLock()
。默认实现会抛出
UnsupportedOperationException
。- 参数:
-
arg
- 获取参数。此值始终是传递给获取方法的值,或者是在条件等待时保存的值。否则,该值未解释,可以表示任何您喜欢的内容。 - 返回:
-
如果成功则返回
true
。成功后,此对象已被获取。 - 抛出:
-
IllegalMonitorStateException
- 如果获取会使此同步器处于非法状态。为了使同步正常工作,必须以一致的方式抛出此异常。 -
UnsupportedOperationException
- 如果不支持独占模式
-
tryRelease
protected boolean tryRelease(long arg) 尝试设置状态以反映以独占模式释放。此方法始终由执行释放的线程调用。
默认实现会抛出
UnsupportedOperationException
。- 参数:
-
arg
- 释放参数。此值始终是传递给释放方法的值,或者在进入条件等待时的当前状态值。否则,该值未解释,可以表示任何您喜欢的内容。 - 返回:
-
如果此对象现在处于完全释放状态,则返回
true
,以便任何等待的线程可以尝试获取;否则返回false
。 - 抛出:
-
IllegalMonitorStateException
- 如果释放会使此同步器处于非法状态。为了使同步正常工作,必须以一致的方式抛出此异常。 -
UnsupportedOperationException
- 如果不支持独占模式
-
isHeldExclusively
protected boolean isHeldExclusively()返回true
,如果同步是独占地由当前(调用)线程持有。此方法在每次调用AbstractQueuedLongSynchronizer.ConditionObject
方法时被调用。默认实现会抛出
UnsupportedOperationException
。此方法仅在AbstractQueuedLongSynchronizer.ConditionObject
方法内部调用,因此如果不使用条件,则无需定义此方法。- 返回:
-
true
- 如果同步是独占的;否则为false
- 抛出:
-
UnsupportedOperationException
- 如果不支持条件
-
acquire
public final void acquire(long arg) 以独占模式获取,忽略中断。通过至少调用一次tryAcquire(long)
来实现,在成功时返回。否则,线程将排队,可能会重复阻塞和解除阻塞,调用tryAcquire(long)
直到成功。此方法可用于实现Lock.lock()
方法。- 参数:
-
arg
- 获取参数。该值传递给tryAcquire(long)
,但否则未经解释,可以表示任何您喜欢的内容。
-
acquireInterruptibly
以独占模式获取,如果被中断则中止。首先检查中断状态,然后至少调用一次tryAcquire(long)
来实现,在成功时返回。否则,线程将排队,可能会重复阻塞和解除阻塞,调用tryAcquire(long)
直到成功或线程被中断。此方法可用于实现Lock.lockInterruptibly()
方法。- 参数:
-
arg
- 获取参数。该值传递给tryAcquire(long)
,但否则未经解释,可以表示任何您喜欢的内容。 - 抛出:
-
InterruptedException
- 如果当前线程被中断
-
tryAcquireNanos
尝试以独占模式获取,如果被中断则中止,并且如果给定的超时时间过去则失败。首先检查中断状态,然后至少调用一次tryAcquire(long)
来实现,在成功时返回。否则,线程将排队,可能会重复阻塞和解除阻塞,调用tryAcquire(long)
直到成功或线程被中断或超时时间过去。此方法可用于实现Lock.tryLock(long, TimeUnit)
方法。- 参数:
-
arg
- 获取参数。该值传递给tryAcquire(long)
,但否则未经解释,可以表示任何您喜欢的内容。 -
nanosTimeout
- 等待的最大纳秒数 - 返回:
-
true
- 如果获取成功;false
- 如果超时 - 抛出:
-
InterruptedException
- 如果当前线程被中断
-
release
public final boolean release(long arg) 以独占模式释放。如果tryRelease(long)
返回true,则解除一个或多个线程的阻塞。此方法可用于实现Lock.unlock()
方法。- 参数:
-
arg
- 释放参数。该值传递给tryRelease(long)
,但否则未经解释,可以表示任何您喜欢的内容。 - 返回:
-
从
tryRelease(long)
返回的值
-
hasQueuedThreads
public final boolean hasQueuedThreads()查询是否有任何线程正在等待获取。请注意,由于中断和超时导致的取消可能随时发生,因此返回true
并不保证任何其他线程将会获取。- 返回:
-
true
- 如果可能有其他线程正在等待获取
-
hasContended
public final boolean hasContended()查询是否有任何线程曾经争夺获取此同步器;也就是说,是否曾经阻塞过获取方法。在此实现中,此操作在常量时间内返回。
- 返回:
-
true
- 如果曾经存在争夺
-
getFirstQueuedThread
返回队列中的第一个(等待时间最长)线程,如果当前没有线程在排队则返回null
。在此实现中,此操作通常在常量时间内返回,但如果其他线程同时修改队列,则可能会迭代争用。
- 返回:
-
队列中的第一个(等待时间最长)线程,如果当前没有线程在排队则返回
null
-
isQueued
如果给定线程当前在队列中,则返回true
。此实现遍历队列以确定给定线程是否存在。
- 参数:
-
thread
- 线程 - 返回:
-
true
- 如果给定线程在队列中 - 抛出:
-
NullPointerException
- 如果线程为null
-
hasQueuedPredecessors
public final boolean hasQueuedPredecessors()查询是否有任何线程等待获取比当前线程更长的时间。调用此方法等效于(但可能比以下方法更有效):
getFirstQueuedThread() != Thread.currentThread() && hasQueuedThreads()
请注意,由于中断和超时可能随时发生,返回
true
并不保证其他线程会在当前线程之前获取。同样,可能会有另一个线程在此方法返回false
后赢得排队的竞赛,因为队列为空。此方法旨在供公平同步器使用,以避免插队。这样的同步器的
tryAcquire(long)
方法应返回false
,并且如果此方法返回true
(除非这是一个可重入获取),则其tryAcquireShared(long)
方法应返回负值。例如,公平、可重入、独占模式同步器的tryAcquire
方法可能如下所示:protected boolean tryAcquire(long arg) { if (isHeldExclusively()) { // 可重入获取;增加持有计数 return true; } else if (hasQueuedPredecessors()) { return false; } else { // 尝试正常获取 } }
- 返回:
-
如果有排队在当前线程之前的线程,则返回
true
,如果当前线程位于队列头部或队列为空,则返回false
- 自:
- 1.7
-
getQueueLength
public final int getQueueLength()返回等待获取的线程数的估计值。该值仅是一个估计,因为在此方法遍历内部数据结构时,线程数可能会动态变化。此方法设计用于监视系统状态,而不是用于同步控制。- 返回:
- 等待获取的线程数的估计值
-
getQueuedThreads
返回一个包含可能正在等待获取的线程的集合。由于在构造此结果时实际线程集可能会动态变化,因此返回的集合仅是最佳估计。返回的集合中的元素没有特定顺序。此方法旨在促进提供更广泛监控设施的子类的构建。- 返回:
- 线程的集合
-
getExclusiveQueuedThreads
返回一个包含可能正在以独占模式等待获取的线程的集合。这与getQueuedThreads()
具有相同的属性,只是它仅返回由于独占获取而等待的那些线程。- 返回:
- 线程的集合
-
toString
-
owns
查询给定的ConditionObject是否使用此同步器作为其锁。- 参数:
-
condition
- 条件 - 返回:
-
如果拥有则返回
true
- 抛出:
-
NullPointerException
- 如果条件为null
-
hasWaiters
查询是否有任何线程正在等待与此同步器关联的给定条件。请注意,因为超时和中断可能随时发生,返回true
并不保证将来的signal
会唤醒任何线程。此方法主要设计用于监视系统状态。- 参数:
-
condition
- 条件 - 返回:
-
如果有任何等待的线程则返回
true
- 抛出:
-
IllegalMonitorStateException
- 如果没有持有独占同步 -
IllegalArgumentException
- 如果给定条件与此同步器不相关 -
NullPointerException
- 如果条件为null
-
getWaitQueueLength
返回等待与此同步器关联的给定条件的线程数的估计值。请注意,因为超时和中断可能随时发生,估计仅作为实际等待线程数的上限。此方法设计用于监视系统状态,而不是用于同步控制。- 参数:
-
condition
- 条件 - 返回:
- 等待线程数的估计值
- 抛出:
-
IllegalMonitorStateException
- 如果没有持有独占同步 -
IllegalArgumentException
- 如果给定条件与此同步器不相关 -
NullPointerException
- 如果条件为null
-
getWaitingThreads
public final Collection<Thread> getWaitingThreads(AbstractQueuedLongSynchronizer.ConditionObject condition) 返回一个包含可能正在等待与此同步器关联的给定条件的线程的集合。由于在构造此结果时实际线程集可能会动态变化,因此返回的集合仅是最佳估计。返回的集合中的元素没有特定顺序。- 参数:
-
condition
- 条件 - 返回:
- 线程的集合
- 抛出:
-
IllegalMonitorStateException
- 如果没有持有独占同步 -
IllegalArgumentException
- 如果给定条件与此同步器不相关 -
NullPointerException
- 如果条件为null
-