Most visited

Recently visited

Added in API level 24

StampedLock

public class StampedLock
extends Object implements Serializable

java.lang.Object
   ↳ java.util.concurrent.locks.StampedLock


基于能力的锁定,具有三种控制读/写访问的模式。 StampedLock的状态由一个版本和模式组成。 锁定采集方法返回一个表示和控制与锁定状态相关的访问的标记; 这些方法的“尝试”版本可能会返回特殊值零来表示获取访问失败。 锁定释放和转换方法需要将邮票作为参数,并且如果它们与锁的状态不匹配,则会失败。 这三种模式是:

此类还支持有条件地提供三种模式转换的方法。 例如,方法tryConvertToWriteLock(long)尝试“升级”模式,如果(1)已处于书写模式(2)处于阅读模式并且没有其他读取器或(3)处于乐观模式且锁定可用,则返回有效的写入标记。 这些方法的形式旨在帮助减少在基于重试的设计中发生的一些代码膨胀。

StampedLocks被设计用作开发线程安全组件的内部工具。 他们的使用依赖于他们所保护的数据,对象和方法的内部属性的知识。 它们不是可重入的,因此锁定的机构不应该调用其他可能尝试重新获取锁定的未知方法(尽管您可以将戳记传递给可以使用或转换它的其他方法)。 读取锁定模式的使用依赖于相关的代码段是无副作用的。 未经验证的乐观阅读部分不能调用未知的方法来容忍潜在的不一致。 邮票使用有限的表示,并且不具有密码安全性(即,有效的邮票可能是可猜测的)。 在连续运行一年后(不止一年),印花值可能会回收。 没有使用或验证时间长于此期限的图章可能无法正确验证。 StampedLocks是可序列化的,但总是反序列化到初始解锁状态,所以它们对远程锁定没有用处。

StampedLock的调度策略并不总是偏爱读者而不是写者,反之亦然。 所有“尝试”方法都是尽力而为,并不一定符合任何调度或公平策略。 任何用于获取或转换锁的“尝试”方法的零返回不包含关于锁的状态的任何信息; 随后的调用可能会成功。

由于它支持跨多种锁定模式的协调使用,因此该类不直接实现LockReadWriteLock接口。 然而,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);
     }
   }
 }

Summary

Public constructors

StampedLock()

创建一个新的锁,最初处于解锁状态。

Public methods

Lock asReadLock()

返回此StampedLock的一个普通 Lock视图,其中 lock()方法映射到 readLock() ,对于其他方法也是如此。

ReadWriteLock asReadWriteLock()

返回此StampedLock的 ReadWriteLock视图,其中 readLock()方法映射到 asReadLock()writeLock()asWriteLock()

Lock asWriteLock()

返回此StampedLock的一个普通 Lock视图,其中 lock()方法映射到 writeLock() ,对于其他方法也如此。

int getReadLockCount()

查询为此锁持有的读锁的数量。

boolean isReadLocked()

如果锁目前保持非排他性,则返回 true

boolean isWriteLocked()

如果该锁当前仅 true则返回 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)

如果从给定的邮票发行以来尚未完全获取锁定,则返回true。

long writeLock()

独家获取锁,如果需要锁定,直到可用。

long writeLockInterruptibly()

独占获取锁,必要时锁定,直到可用或当前线程中断。

Inherited methods

From class java.lang.Object

Public constructors

StampedLock

Added in API level 24
StampedLock ()

创建一个新的锁,最初处于解锁状态。

Public methods

asReadLock

Added in API level 24
Lock asReadLock ()

返回此StampedLock的普通Lock视图,其中lock()方法映射到readLock() ,对于其他方法也如此。 返回的锁不支持Condition ; 方法newCondition()抛出UnsupportedOperationException

Returns
Lock the lock

asReadWriteLock

Added in API level 24
ReadWriteLock asReadWriteLock ()

返回此StampedLock的 ReadWriteLock视图,其中 readLock()方法映射到 asReadLock()writeLock()asWriteLock()

Returns
ReadWriteLock the lock

asWriteLock

Added in API level 24
Lock asWriteLock ()

返回此StampedLock的一个普通Lock视图,其中lock()方法映射到writeLock() ,对于其他方法也是如此。 返回的锁不支持Condition ; 方法newCondition()抛出UnsupportedOperationException

Returns
Lock the lock

getReadLockCount

Added in API level 24
int getReadLockCount ()

查询为此锁持有的读锁的数量。 此方法设计用于监视系统状态,而不是用于同步控制。

Returns
int the number of read locks held

isReadLocked

Added in API level 24
boolean isReadLocked ()

如果锁目前保持非排他性,则返回 true

Returns
boolean true if the lock is currently held non-exclusively

isWriteLocked

Added in API level 24
boolean isWriteLocked ()

如果该锁当前仅 true则返回 true

Returns
boolean true if the lock is currently held exclusively

readLock

Added in API level 24
long readLock ()

非独占获取锁,必要时锁定,直到可用。

Returns
long a stamp that can be used to unlock or convert mode

readLockInterruptibly

Added in API level 24
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

toString

Added in API level 24
String toString ()

返回标识此锁定的字符串以及其锁定状态。 括号中的状态包括字符串"Unlocked"或字符串"Write-locked"或字符串"Read-locks:"后跟当前保持的读锁数量。

Returns
String a string identifying this lock, as well as its lock state

tryConvertToOptimisticRead

Added in API level 24
long tryConvertToOptimisticRead (long stamp)

如果锁定状态与给定的邮票相匹配,则自动地如果邮票表示持有锁定,则释放它并返回观察戳。 或者,如果乐观的读取,如果验证返回它。 在所有其他情况下,此方法返回零,因此可能会用作“tryUnlock”的一种形式。

Parameters
stamp long: a stamp
Returns
long a valid optimistic read stamp, or zero on failure

tryConvertToReadLock

Added in API level 24
long tryConvertToReadLock (long stamp)

如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 如果邮票表示持有写入锁定,则释放它并获得读取锁定。 或者,如果读取锁定,则返回它。 或者,如果乐观读取,则只有在立即可用时才获取读取锁定并返回读取戳记。 在所有其他情况下,此方法返回零。

Parameters
stamp long: a stamp
Returns
long a valid read stamp, or zero on failure

tryConvertToWriteLock

Added in API level 24
long tryConvertToWriteLock (long stamp)

如果锁定状态与给定的标记匹配,则自动执行以下操作之一。 如果邮票表示持有写锁定,则将其返回。 或者,如果读取锁定(如果写入锁定可用)则释放读取锁定并返回写入标记。 或者,如果乐观的阅读,只有在立即可用时才返回写邮票。 在所有其他情况下,此方法返回零。

Parameters
stamp long: a stamp
Returns
long a valid write stamp, or zero on failure

tryOptimisticRead

Added in API level 24
long tryOptimisticRead ()

返回一个稍后可以验证的印记,如果完全锁定,则返回零。

Returns
long a stamp, or zero if exclusively locked

tryReadLock

Added in API level 24
long tryReadLock ()

如果立即可用,则非专有地获取锁。

Returns
long a stamp that can be used to unlock or convert mode, or zero if the lock is not available

tryReadLock

Added in API level 24
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

tryUnlockRead

Added in API level 24
boolean tryUnlockRead ()

如果读取锁被保持,则释放一个保持,而不需要戳记值。 此方法可能对错误后的恢复有用。

Returns
boolean true if the read lock was held, else false

tryUnlockWrite

Added in API level 24
boolean tryUnlockWrite ()

释放写入锁定,如果它被保留,而不需要戳记值。 此方法可能对错误后的恢复有用。

Returns
boolean true if the lock was held, else false

tryWriteLock

Added in API level 24
long tryWriteLock ()

如果立即可用,则独占获取锁。

Returns
long a stamp that can be used to unlock or convert mode, or zero if the lock is not available

tryWriteLock

Added in API level 24
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

unlock

Added in API level 24
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

unlockRead

Added in API level 24
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

unlockWrite

Added in API level 24
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

validate

Added in API level 24
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

writeLock

Added in API level 24
long writeLock ()

独家获取锁,如果需要锁定,直到可用。

Returns
long a stamp that can be used to unlock or convert mode

writeLockInterruptibly

Added in API level 24
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

Hooray!