public class StampedLock extends Object implements Serializable
writeLock()可能等待独家访问,返回一个邮票,可以用在方法unlockWrite(long)释放锁。还提供了tryWriteLock不计时和计时的版本。当锁是在写模式,没有读锁可以得到,所有乐观读取验证将失败。readLock()可能等待非独家访问,返回一个邮票,可以用在方法unlockRead(long)释放锁。不计时和计时还提供版本tryReadLock。tryOptimisticRead()返回非零的邮票只有锁不目前关押在写模式。方法validate(long)返回true如果锁尚未获得在写模式由于获得一个给定的邮票。这种模式可以被认为是一个非常弱版本的读锁,可以打破一个作家在任何时间。使用乐观模式的短只读代码段经常减少争用,提高吞吐量。然而,它的使用本质上是脆弱的。乐观的阅读部分应该只读取字段,并将它们保持在本地变量中,以供验证后使用。而在乐观的领域阅读模式可能非常不一致,所以使用仅适用于当你足够熟悉数据表示的一致性检查和/或多次调用方法validate()。例如,这些步骤通常是在第一次阅读的对象或数组引用,然后访问它的一个领域,元素或方法。该类还支持有条件地提供三种模式的转换的方法。例如,方法tryConvertToWriteLock(long)试图“升级”模式,返回一个有效的写邮票如果(1)已经在写作模式(2)阅读模式并没有其他读者或(3)在乐观的模式和锁可用。这些方法的形式是为了帮助减少一些代码膨胀,否则发生在重试的基础设计。
stampedlocks设计用于在线程安全的组件开发的内部设施。他们的使用依赖于知识的数据,对象和方法,他们正在保护的内部属性。他们是不可重入的,所以锁定机构不应调用其他未知的方法,可以尝试重新获取锁(尽管你可以通过邮票的其他的方法,可以使用或转换)。读锁模式的使用依赖于相关的代码部分,该部分是无副作用的。未经验证的乐观的阅读部分不能调用的方法不被容忍的潜在矛盾。邮票使用有限的陈述,而不是加密的安全(例如,一个有效的邮票可以被猜到的)。邮票值可以回收(不比)一年连续运行。没有使用或验证的邮票,比这一时期更长的时间可能无法正确验证。stampedlocks是可序列化的,但总是反序列化为初始解锁状态,所以他们不用于远程锁定。
对stampedlock调度政策不一贯喜欢读者对作家或反之亦然。所有“尝试”的方法是最好的努力,不一定符合任何调度或公平的政策。一零返回从任何“尝试”的方法获取或转换锁不携带任何关于锁的状态的信息,随后的调用可能会成功。
因为它支持协调使用跨多个锁模式,这类不直接实现Lock或ReadWriteLock接口。然而,一个stampedlock可以视asReadLock(),asWriteLock(),或asReadWriteLock()在只需要相关的功能的应用。
示例用法。以下说明一类,保持简单的二维点的一些用法的成语。示例代码说明了一些try/catch公约虽然它们不是严格需要在这里因为没有例外可以在他们的bodies.
发生
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);
}
}
}
| Constructor and Description |
|---|
StampedLock()
创建一个新的锁,最初处于解锁状态。
|
| Modifier and Type | Method and Description |
|---|---|
Lock |
asReadLock()
|
ReadWriteLock |
asReadWriteLock()
返回该stampedlock,
ReadWriteLock.readLock()方法映射到一个
ReadWriteLock
asReadLock()来看,和
ReadWriteLock.writeLock()到
asWriteLock()。
|
Lock |
asWriteLock()
|
int |
getReadLockCount()
查询此锁的读取锁的数量。
|
boolean |
isReadLocked()
返回
true如果锁是目前持有的非专。
|
boolean |
isWriteLocked()
返回
true如果锁是目前独家持有。
|
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)
如果从给定的给定标记的发行以来未完全获得锁定,则返回真。
|
long |
writeLock()
只获取锁,阻塞,如果有必要,直到可用。
|
long |
writeLockInterruptibly()
只获取锁,如果必要,阻塞,直到可用或当前线程被中断。
|
public long writeLock()
public long tryWriteLock()
public long tryWriteLock(long time,
TimeUnit unit)
throws InterruptedException
Lock.tryLock(long,TimeUnit)指定方法。
time -最大时间等待锁
unit的
time争论的时间单位
InterruptedException -如果当前线程在获取锁中断
public long writeLockInterruptibly()
throws InterruptedException
Lock.lockInterruptibly()指定行为的方法。
InterruptedException -如果当前线程在获取锁中断
public long readLock()
public long tryReadLock()
public long tryReadLock(long time,
TimeUnit unit)
throws InterruptedException
Lock.tryLock(long,TimeUnit)指定方法。
time -最大时间等待锁
unit的
time争论的时间单位
InterruptedException -如果当前线程在获取锁中断
public long readLockInterruptibly()
throws InterruptedException
Lock.lockInterruptibly()指定行为的方法。
InterruptedException -如果当前线程在获取锁中断
public long tryOptimisticRead()
public boolean validate(long stamp)
tryOptimisticRead()或锁定方法对该锁获得的值没有定义的效果或结果。
stamp -邮票
true如果锁还没有完全获得从给定的邮票发行;其他虚假
public void unlockWrite(long stamp)
stamp -邮票返回一个写锁操作
IllegalMonitorStateException如果标记不符合这个锁的当前状态
public void unlockRead(long stamp)
stamp -邮票返回读取锁定操作
IllegalMonitorStateException如果标记不符合这个锁的当前状态
public void unlock(long stamp)
stamp -邮票由锁操作
IllegalMonitorStateException如果标记不符合这个锁的当前状态
public long tryConvertToWriteLock(long stamp)
stamp -邮票
public long tryConvertToReadLock(long stamp)
stamp -邮票
public long tryConvertToOptimisticRead(long stamp)
stamp -邮票
public boolean tryUnlockWrite()
true如果锁举行,其他假
public boolean tryUnlockRead()
true如果读锁举行,其他假
public boolean isWriteLocked()
true如果锁是目前独家持有。
true如果锁是目前独家持有
public boolean isReadLocked()
true如果锁是目前持有的非专。
true如果锁是目前持有的非专
public int getReadLockCount()
public String toString()
"Unlocked"或字符串或字符串
"Write-locked"
"Read-locks:"后跟当前数读锁。
public Lock asReadLock()
Lock.lock()方法映射到
readLock()平原
Lock视图,和类似的其他方法。返回的锁不支持
Condition;方法
Lock.newCondition()抛出
UnsupportedOperationException。
public Lock asWriteLock()
Lock.lock()方法映射到
writeLock()平原
Lock视图,和类似的其他方法。返回的锁不支持
Condition;方法
Lock.newCondition()抛出
UnsupportedOperationException。
public ReadWriteLock asReadWriteLock()
ReadWriteLock.readLock()方法映射到一个
ReadWriteLock
asReadLock()来看,和
ReadWriteLock.writeLock()到
asWriteLock()。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.