public class StampedLock
extends Object
implements Serializable
java.lang.Object | |
↳ | java.util.concurrent.locks.StampedLock |
基于能力的锁定,具有三种控制读/写访问的模式。 StampedLock的状态由一个版本和模式组成。 锁定采集方法返回一个表示和控制与锁定状态相关的访问的标记; 这些方法的“尝试”版本可能会返回特殊值零来表示获取访问失败。 锁定释放和转换方法需要将邮票作为参数,并且如果它们与锁的状态不匹配,则会失败。 这三种模式是:
writeLock()
possibly blocks waiting for exclusive access, returning a stamp that can be used in method unlockWrite(long)
to release the lock. Untimed and timed versions of tryWriteLock
are also provided. When the lock is held in write mode, no read locks may be obtained, and all optimistic read validations will fail. readLock()
possibly blocks waiting for non-exclusive access, returning a stamp that can be used in method unlockRead(long)
to release the lock. Untimed and timed versions of tryReadLock
are also provided. tryOptimisticRead()
returns a non-zero stamp only if the lock is not currently held in write mode. Method validate(long)
returns true if the lock has not been acquired in write mode since obtaining a given stamp. This mode can be thought of as an extremely weak version of a read-lock, that can be broken by a writer at any time. The use of optimistic mode for short read-only code segments often reduces contention and improves throughput. However, its use is inherently fragile. Optimistic read sections should only read fields and hold them in local variables for later use after validation. Fields read while in optimistic mode may be wildly inconsistent, so usage applies only when you are familiar enough with data representations to check consistency and/or repeatedly invoke method validate()
. For example, such steps are typically required when first reading an object or array reference, and then accessing one of its fields, elements or methods. 此类还支持有条件地提供三种模式转换的方法。 例如,方法tryConvertToWriteLock(long)
尝试“升级”模式,如果(1)已处于书写模式(2)处于阅读模式并且没有其他读取器或(3)处于乐观模式且锁定可用,则返回有效的写入标记。 这些方法的形式旨在帮助减少在基于重试的设计中发生的一些代码膨胀。
StampedLocks被设计用作开发线程安全组件的内部工具。 他们的使用依赖于他们所保护的数据,对象和方法的内部属性的知识。 它们不是可重入的,因此锁定的机构不应该调用其他可能尝试重新获取锁定的未知方法(尽管您可以将戳记传递给可以使用或转换它的其他方法)。 读取锁定模式的使用依赖于相关的代码段是无副作用的。 未经验证的乐观阅读部分不能调用未知的方法来容忍潜在的不一致。 邮票使用有限的表示,并且不具有密码安全性(即,有效的邮票可能是可猜测的)。 在连续运行一年后(不止一年),印花值可能会回收。 没有使用或验证时间长于此期限的图章可能无法正确验证。 StampedLocks是可序列化的,但总是反序列化到初始解锁状态,所以它们对远程锁定没有用处。
StampedLock的调度策略并不总是偏爱读者而不是写者,反之亦然。 所有“尝试”方法都是尽力而为,并不一定符合任何调度或公平策略。 任何用于获取或转换锁的“尝试”方法的零返回不包含关于锁的状态的任何信息; 随后的调用可能会成功。
由于它支持跨多种锁定模式的协调使用,因此该类不直接实现Lock
或ReadWriteLock
接口。 然而,StampedLock可以看作asReadLock()
, asWriteLock()
,或asReadWriteLock()
中,仅需要在一组相关联的功能的应用程序。
样例用法。 以下举例说明了维护简单二维点的类中的一些使用习惯用法。 示例代码说明了一些try / catch约定,尽管这里并不严格需要它们,因为它们的主体中不会出现异常。
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
void move(double deltaX, double deltaY) { // an exclusively locked method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
if (!sl.validate(stamp)) {
stamp = sl.readLock();
try {
currentX = x;
currentY = y;
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
void moveIfAtOrigin(double newX, double newY) { // upgrade
// Could instead start with optimistic, not read mode
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}
Public constructors |
|
---|---|
StampedLock() 创建一个新的锁,最初处于解锁状态。 |
Public methods |
|
---|---|
Lock |
asReadLock() 返回此StampedLock的一个普通 |
ReadWriteLock |
asReadWriteLock() 返回此StampedLock的 |
Lock |
asWriteLock() 返回此StampedLock的一个普通 |
int |
getReadLockCount() 查询为此锁持有的读锁的数量。 |
boolean |
isReadLocked() 如果锁目前保持非排他性,则返回 |
boolean |
isWriteLocked() 如果该锁当前仅 |
long |
readLock() 非独占获取锁,必要时锁定,直到可用。 |
long |
readLockInterruptibly() 非唯一地获取锁,必要时阻塞直到可用或当前线程中断。 |
String |
toString() 返回标识此锁定的字符串以及其锁定状态。 |
long |
tryConvertToOptimisticRead(long stamp) 如果锁定状态与给定的邮票相匹配,则自动地如果邮票表示持有锁定,则释放它并返回观察戳。 |
long |
tryConvertToReadLock(long stamp) 如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 |
long |
tryConvertToWriteLock(long stamp) 如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 |
long |
tryOptimisticRead() 返回一个稍后可以验证的印记,如果完全锁定,则返回零。 |
long |
tryReadLock() 如果立即可用,则非专有地获取锁。 |
long |
tryReadLock(long time, TimeUnit unit) 如果在给定时间内可用并且当前线程未被中断,则非唯一地获取锁。 |
boolean |
tryUnlockRead() 如果读取锁被保持,则释放一个保持,而不需要戳记值。 |
boolean |
tryUnlockWrite() 释放写入锁定,如果它被保留,而不需要戳记值。 |
long |
tryWriteLock() 如果立即可用,则独占获取锁。 |
long |
tryWriteLock(long time, TimeUnit unit) 如果在给定时间内可用并且当前线程尚未中断,则独占地获取该锁。 |
void |
unlock(long stamp) 如果锁定状态与给定戳记匹配,则释放锁定的相应模式。 |
void |
unlockRead(long stamp) 如果锁定状态符合给定的印章,则释放非排他锁定。 |
void |
unlockWrite(long stamp) 如果锁定状态匹配给定的印章,则释放排他锁定。 |
boolean |
validate(long stamp) 如果从给定的邮票发行以来尚未完全获取锁定,则返回true。 |
long |
writeLock() 独家获取锁,如果需要锁定,直到可用。 |
long |
writeLockInterruptibly() 独占获取锁,必要时锁定,直到可用或当前线程中断。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
Lock asReadLock ()
返回此StampedLock的普通Lock
视图,其中lock()
方法映射到readLock()
,对于其他方法也如此。 返回的锁不支持Condition
; 方法newCondition()
抛出UnsupportedOperationException
。
Returns | |
---|---|
Lock |
the lock |
ReadWriteLock asReadWriteLock ()
返回此StampedLock的 ReadWriteLock
视图,其中 readLock()
方法映射到 asReadLock()
和 writeLock()
到 asWriteLock()
。
Returns | |
---|---|
ReadWriteLock |
the lock |
Lock asWriteLock ()
返回此StampedLock的一个普通Lock
视图,其中lock()
方法映射到writeLock()
,对于其他方法也是如此。 返回的锁不支持Condition
; 方法newCondition()
抛出UnsupportedOperationException
。
Returns | |
---|---|
Lock |
the lock |
int getReadLockCount ()
查询为此锁持有的读锁的数量。 此方法设计用于监视系统状态,而不是用于同步控制。
Returns | |
---|---|
int |
the number of read locks held |
boolean isReadLocked ()
如果锁目前保持非排他性,则返回 true
。
Returns | |
---|---|
boolean |
true if the lock is currently held non-exclusively |
boolean isWriteLocked ()
如果该锁当前仅 true
则返回 true
。
Returns | |
---|---|
boolean |
true if the lock is currently held exclusively |
long readLock ()
非独占获取锁,必要时锁定,直到可用。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode |
long readLockInterruptibly ()
非唯一地获取锁,必要时阻塞直到可用或当前线程中断。 中断下的行为与方法lockInterruptibly()
指定的行为相匹配。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode |
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted before acquiring the lock |
String toString ()
返回标识此锁定的字符串以及其锁定状态。 括号中的状态包括字符串"Unlocked"
或字符串"Write-locked"
或字符串"Read-locks:"
后跟当前保持的读锁数量。
Returns | |
---|---|
String |
a string identifying this lock, as well as its lock state |
long tryConvertToOptimisticRead (long stamp)
如果锁定状态与给定的邮票相匹配,则自动地如果邮票表示持有锁定,则释放它并返回观察戳。 或者,如果乐观的读取,如果验证返回它。 在所有其他情况下,此方法返回零,因此可能会用作“tryUnlock”的一种形式。
Parameters | |
---|---|
stamp |
long : a stamp |
Returns | |
---|---|
long |
a valid optimistic read stamp, or zero on failure |
long tryConvertToReadLock (long stamp)
如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 如果邮票表示持有写入锁定,则释放它并获得读取锁定。 或者,如果读取锁定,则返回它。 或者,如果乐观读取,则只有在立即可用时才获取读取锁定并返回读取戳记。 在所有其他情况下,此方法返回零。
Parameters | |
---|---|
stamp |
long : a stamp |
Returns | |
---|---|
long |
a valid read stamp, or zero on failure |
long tryConvertToWriteLock (long stamp)
如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 如果邮票表示持有写锁定,则将其返回。 或者,如果读取锁定(如果写入锁定可用)则释放读取锁定并返回写入标记。 或者,如果乐观的阅读,只有在立即可用时才返回写邮票。 在所有其他情况下,此方法返回零。
Parameters | |
---|---|
stamp |
long : a stamp |
Returns | |
---|---|
long |
a valid write stamp, or zero on failure |
long tryOptimisticRead ()
返回一个稍后可以验证的印记,如果完全锁定,则返回零。
Returns | |
---|---|
long |
a stamp, or zero if exclusively locked |
long tryReadLock ()
如果立即可用,则非专有地获取锁。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode, or zero if the lock is not available |
long tryReadLock (long time, TimeUnit unit)
如果在给定时间内可用并且当前线程未被中断,则非唯一地获取锁。 超时和中断下的行为与为方法tryLock(long, TimeUnit)
指定的行为相匹配。
Parameters | |
---|---|
time |
long : the maximum time to wait for the lock |
unit |
TimeUnit : the time unit of the time argument |
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode, or zero if the lock is not available |
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted before acquiring the lock |
boolean tryUnlockRead ()
如果读取锁被保持,则释放一个保持,而不需要戳记值。 此方法可能对错误后的恢复有用。
Returns | |
---|---|
boolean |
true if the read lock was held, else false |
boolean tryUnlockWrite ()
释放写入锁定,如果它被保留,而不需要戳记值。 此方法可能对错误后的恢复有用。
Returns | |
---|---|
boolean |
true if the lock was held, else false |
long tryWriteLock ()
如果立即可用,则独占获取锁。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode, or zero if the lock is not available |
long tryWriteLock (long time, TimeUnit unit)
如果在给定时间内可用并且当前线程尚未中断,则独占地获取该锁。 超时和中断时的行为与为方法tryLock(long, TimeUnit)
指定的行为相匹配。
Parameters | |
---|---|
time |
long : the maximum time to wait for the lock |
unit |
TimeUnit : the time unit of the time argument |
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode, or zero if the lock is not available |
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted before acquiring the lock |
void unlock (long stamp)
如果锁定状态与给定戳记匹配,则释放锁定的相应模式。
Parameters | |
---|---|
stamp |
long : a stamp returned by a lock operation |
Throws | |
---|---|
IllegalMonitorStateException |
if the stamp does not match the current state of this lock |
void unlockRead (long stamp)
如果锁定状态符合给定的印章,则释放非排他锁定。
Parameters | |
---|---|
stamp |
long : a stamp returned by a read-lock operation |
Throws | |
---|---|
IllegalMonitorStateException |
if the stamp does not match the current state of this lock |
void unlockWrite (long stamp)
如果锁定状态匹配给定的印章,则释放排他锁定。
Parameters | |
---|---|
stamp |
long : a stamp returned by a write-lock operation |
Throws | |
---|---|
IllegalMonitorStateException |
if the stamp does not match the current state of this lock |
boolean validate (long stamp)
如果从给定的邮票发行以来尚未完全获取锁定,则返回true。 如果邮票为零,总是返回false。 如果邮票代表当前持有的锁,则始终返回true。 使用未从tryOptimisticRead()
获取的值或此锁的锁定方法调用此方法没有定义的效果或结果。
Parameters | |
---|---|
stamp |
long : a stamp |
Returns | |
---|---|
boolean |
true if the lock has not been exclusively acquired since issuance of the given stamp; else false |
long writeLock ()
独家获取锁,如果需要锁定,直到可用。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode |
long writeLockInterruptibly ()
独占获取锁,必要时锁定,直到可用或当前线程中断。 中断下的行为与方法lockInterruptibly()
指定的lockInterruptibly()
。
Returns | |
---|---|
long |
a stamp that can be used to unlock or convert mode |
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted before acquiring the lock |