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.