# StampedLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Summary:[Ctors](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#pubctors)\|[Methods](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#pubmethods)\|[Inherited Methods](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#inhmethods)  

# StampedLock

`
public


class
StampedLock
`  
`

extends `[Object](https://developer.android.com/reference/java/lang/Object)`


``


implements

`[Serializable](https://developer.android.com/reference/java/io/Serializable)`


`

|---|----------------------------------------|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | java.util.concurrent.locks.StampedLock |

<br />

*** ** * ** ***

A capability-based lock with three modes for controlling read/write access. The state of a StampedLock consists of a version and mode. Lock acquisition methods return a stamp that represents and controls access with respect to a lock state; "try" versions of these methods may instead return the special value zero to represent failure to acquire access. Lock release and conversion methods require stamps as arguments, and fail if they do not match the state of the lock. The three modes are:

- **Writing.** Method[writeLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#writeLock())possibly blocks waiting for exclusive access, returning a stamp that can be used in method[unlockWrite(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#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.
- **Reading.** Method[readLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#readLock())possibly blocks waiting for non-exclusive access, returning a stamp that can be used in method[unlockRead(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#unlockRead(long))to release the lock. Untimed and timed versions of`tryReadLock`are also provided.
- **Optimistic Reading.** Method[tryOptimisticRead()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryOptimisticRead())returns a non-zero stamp only if the lock is not currently held in write mode. Method[validate(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#validate(long))returns true if the lock has not been acquired in write mode since obtaining a given stamp, in which case all actions prior to the most recent write lock release happen-before actions following the call to`tryOptimisticRead`. 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 read 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 read 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.

This class also supports methods that conditionally provide conversions across the three modes. For example, method[tryConvertToWriteLock(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToWriteLock(long))attempts to "upgrade" a mode, returning a valid write stamp if (1) already in writing mode (2) in reading mode and there are no other readers or (3) in optimistic read mode and the lock is available. The forms of these methods are designed to help reduce some of the code bloat that otherwise occurs in retry-based designs.

StampedLocks are designed for use as internal utilities in the development of thread-safe components. Their use relies on knowledge of the internal properties of the data, objects, and methods they are protecting. They are not reentrant, so locked bodies should not call other unknown methods that may try to re-acquire locks (although you may pass a stamp to other methods that can use or convert it). The use of read lock modes relies on the associated code sections being side-effect-free. Unvalidated optimistic read sections cannot call methods that are not known to tolerate potential inconsistencies. Stamps use finite representations, and are not cryptographically secure (i.e., a valid stamp may be guessable). Stamp values may recycle after (no sooner than) one year of continuous operation. A stamp held without use or validation for longer than this period may fail to validate correctly. StampedLocks are serializable, but always deserialize into initial unlocked state, so they are not useful for remote locking.

Like[Semaphore](https://developer.android.com/reference/java/util/concurrent/Semaphore), but unlike most[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)implementations, StampedLocks have no notion of ownership. Locks acquired in one thread can be released or converted in another.

The scheduling policy of StampedLock does not consistently prefer readers over writers or vice versa. All "try" methods are best-effort and do not necessarily conform to any scheduling or fairness policy. A zero return from any "try" method for acquiring or converting locks does not carry any information about the state of the lock; a subsequent invocation may succeed.

Because it supports coordinated usage across multiple lock modes, this class does not directly implement the[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)or[ReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock)interfaces. However, a StampedLock may be viewed[asReadLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadLock()),[asWriteLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asWriteLock()), or[asReadWriteLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadWriteLock())in applications requiring only the associated set of functionality.

**Memory Synchronization.** Methods with the effect of successfully locking in any mode have the same memory synchronization effects as a*Lock* action, as described in Chapter 17 ofThe Java Language Specification. Methods successfully unlocking in write mode have the same memory synchronization effects as an*Unlock*action. In optimistic read usages, actions prior to the most recent write mode unlock action are guaranteed to happen-before those following a tryOptimisticRead only if a later validate returns true; otherwise there is no guarantee that the reads between tryOptimisticRead and validate obtain a consistent snapshot.

**Sample Usage.**The following illustrates some usage idioms in a class that maintains simple two-dimensional points. The sample code illustrates some try/catch conventions even though they are not strictly needed here because no exceptions can occur in their bodies.  

     class Point {
       private double x, y;
       private final StampedLock sl = new StampedLock();

       // an exclusively locked method
       void move(double deltaX, double deltaY) {
         long stamp = sl.writeLock();
         try {
           x += deltaX;
           y += deltaY;
         } finally {
           sl.unlockWrite(stamp);
         }
       }

       // a read-only method
       // upgrade from optimistic read to read lock
       double distanceFromOrigin() {
         long stamp = sl.tryOptimisticRead();
         try {
           retryHoldingLock: for (;; stamp = sl.readLock()) {
             if (stamp == 0L)
               continue retryHoldingLock;
             // possibly racy reads
             double currentX = x;
             double currentY = y;
             if (!sl.validate(stamp))
               continue retryHoldingLock;
             return Math.hypot(currentX, currentY);
           }
         } finally {
           if (StampedLock.isReadLockStamp(stamp))
             sl.unlockRead(stamp);
         }
       }

       // upgrade from optimistic read to write lock
       void moveIfAtOrigin(double newX, double newY) {
         long stamp = sl.tryOptimisticRead();
         try {
           retryHoldingLock: for (;; stamp = sl.writeLock()) {
             if (stamp == 0L)
               continue retryHoldingLock;
             // possibly racy reads
             double currentX = x;
             double currentY = y;
             if (!sl.validate(stamp))
               continue retryHoldingLock;
             if (currentX != 0.0 || currentY != 0.0)
               break;
             stamp = sl.tryConvertToWriteLock(stamp);
             if (stamp == 0L)
               continue retryHoldingLock;
             // exclusive access
             x = newX;
             y = newY;
             return;
           }
         } finally {
           if (StampedLock.isWriteLockStamp(stamp))
             sl.unlockWrite(stamp);
         }
       }

       // upgrade read lock to write lock
       void moveIfAtOrigin2(double newX, double newY) {
         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);
         }
       }
     }

<br />

## Summary

|                                                                         ### Public constructors                                                                         ||
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
| ` `[StampedLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#StampedLock())`() ` Creates a new lock, initially in unlocked state. |

|                                                                                                                                                                                                                                                                                                                                                                                                                                  ### Public methods                                                                                                                                                                                                                                                                                                                                                                                                                                  ||
|------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ` `[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)                   | ` `[asReadLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadLock())`() ` Returns a plain[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)view of this StampedLock in which the[Lock.lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lock())method is mapped to[readLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#readLock()), and similarly for other methods.                                                                                                                                                                                                                                                                   |
| ` `[ReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock) | ` `[asReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadWriteLock())`() ` Returns a[ReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock)view of this StampedLock in which the[ReadWriteLock.readLock()](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock#readLock())method is mapped to[asReadLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadLock()), and[ReadWriteLock.writeLock()](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock#writeLock())to[asWriteLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asWriteLock()). |
| ` `[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)                   | ` `[asWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asWriteLock())`() ` Returns a plain[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)view of this StampedLock in which the[Lock.lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lock())method is mapped to[writeLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#writeLock()), and similarly for other methods.                                                                                                                                                                                                                                                               |
| ` int`                                                                                               | ` `[getReadLockCount](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#getReadLockCount())`() ` Queries the number of read locks held for this lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ` static boolean`                                                                                    | ` `[isLockStamp](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isLockStamp(long))`(long stamp) ` Tells whether a stamp represents holding a lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ` static boolean`                                                                                    | ` `[isOptimisticReadStamp](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isOptimisticReadStamp(long))`(long stamp) ` Tells whether a stamp represents a successful optimistic read.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ` static boolean`                                                                                    | ` `[isReadLockStamp](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isReadLockStamp(long))`(long stamp) ` Tells whether a stamp represents holding a lock non-exclusively.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ` boolean`                                                                                           | ` `[isReadLocked](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isReadLocked())`() ` Returns`true`if the lock is currently held non-exclusively.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ` static boolean`                                                                                    | ` `[isWriteLockStamp](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isWriteLockStamp(long))`(long stamp) ` Tells whether a stamp represents holding a lock exclusively.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ` boolean`                                                                                           | ` `[isWriteLocked](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#isWriteLocked())`() ` Returns`true`if the lock is currently held exclusively.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ` long`                                                                                              | ` `[readLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#readLock())`() ` Non-exclusively acquires the lock, blocking if necessary until available.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ` long`                                                                                              | ` `[readLockInterruptibly](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#readLockInterruptibly())`() ` Non-exclusively acquires the lock, blocking if necessary until available or the current thread is interrupted.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ` `[String](https://developer.android.com/reference/java/lang/String)                                | ` `[toString](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#toString())`() ` Returns a string identifying this lock, as well as its lock state.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ` long`                                                                                              | ` `[tryConvertToOptimisticRead](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToOptimisticRead(long))`(long stamp) ` If the lock state matches the given stamp then, atomically, if the stamp represents holding a lock, releases it and returns an observation stamp.                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ` long`                                                                                              | ` `[tryConvertToReadLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToReadLock(long))`(long stamp) ` If the lock state matches the given stamp, atomically performs one of the following actions.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ` long`                                                                                              | ` `[tryConvertToWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToWriteLock(long))`(long stamp) ` If the lock state matches the given stamp, atomically performs one of the following actions.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ` long`                                                                                              | ` `[tryOptimisticRead](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryOptimisticRead())`() ` Returns a stamp that can later be validated, or zero if exclusively locked.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ` long`                                                                                              | ` `[tryReadLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryReadLock())`() ` Non-exclusively acquires the lock if it is immediately available.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ` long`                                                                                              | ` `[tryReadLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryReadLock(long,%20java.util.concurrent.TimeUnit))`(long time, `[TimeUnit](https://developer.android.com/reference/java/util/concurrent/TimeUnit)` unit) ` Non-exclusively acquires the lock if it is available within the given time and the current thread has not been interrupted.                                                                                                                                                                                                                                                                                                                                                                                        |
| ` boolean`                                                                                           | ` `[tryUnlockRead](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryUnlockRead())`() ` Releases one hold of the read lock if it is held, without requiring a stamp value.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ` boolean`                                                                                           | ` `[tryUnlockWrite](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryUnlockWrite())`() ` Releases the write lock if it is held, without requiring a stamp value.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ` long`                                                                                              | ` `[tryWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryWriteLock())`() ` Exclusively acquires the lock if it is immediately available.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ` long`                                                                                              | ` `[tryWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryWriteLock(long,%20java.util.concurrent.TimeUnit))`(long time, `[TimeUnit](https://developer.android.com/reference/java/util/concurrent/TimeUnit)` unit) ` Exclusively acquires the lock if it is available within the given time and the current thread has not been interrupted.                                                                                                                                                                                                                                                                                                                                                                                          |
| ` void`                                                                                              | ` `[unlock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#unlock(long))`(long stamp) ` If the lock state matches the given stamp, releases the corresponding mode of the lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ` void`                                                                                              | ` `[unlockRead](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#unlockRead(long))`(long stamp) ` If the lock state matches the given stamp, releases the non-exclusive lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ` void`                                                                                              | ` `[unlockWrite](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#unlockWrite(long))`(long stamp) ` If the lock state matches the given stamp, releases the exclusive lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ` boolean`                                                                                           | ` `[validate](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#validate(long))`(long stamp) ` Returns true if the lock has not been exclusively acquired since issuance of the given stamp.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ` long`                                                                                              | ` `[writeLock](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#writeLock())`() ` Exclusively acquires the lock, blocking if necessary until available.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ` long`                                                                                              | ` `[writeLockInterruptibly](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#writeLockInterruptibly())`() ` Exclusively acquires the lock, blocking if necessary until available or the current thread is interrupted.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |

| ### Inherited methods |
|-----------------------|---|
| From class` `[java.lang.Object](https://developer.android.com/reference/java/lang/Object)` ` |--------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ` `[Object](https://developer.android.com/reference/java/lang/Object)          | ` `[clone](https://developer.android.com/reference/java/lang/Object#clone())`() ` Creates and returns a copy of this object.                                                                                                                                                      | | ` boolean`                                                                     | ` `[equals](https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object))`(`[Object](https://developer.android.com/reference/java/lang/Object)` obj) ` Indicates whether some other object is "equal to" this one.                                           | | ` void`                                                                        | ` `[finalize](https://developer.android.com/reference/java/lang/Object#finalize())`() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.                                                          | | ` final `[Class](https://developer.android.com/reference/java/lang/Class)`<?>` | ` `[getClass](https://developer.android.com/reference/java/lang/Object#getClass())`() ` Returns the runtime class of this`Object`.                                                                                                                                                | | ` int`                                                                         | ` `[hashCode](https://developer.android.com/reference/java/lang/Object#hashCode())`() ` Returns a hash code value for the object.                                                                                                                                                 | | ` final void`                                                                  | ` `[notify](https://developer.android.com/reference/java/lang/Object#notify())`() ` Wakes up a single thread that is waiting on this object's monitor.                                                                                                                            | | ` final void`                                                                  | ` `[notifyAll](https://developer.android.com/reference/java/lang/Object#notifyAll())`() ` Wakes up all threads that are waiting on this object's monitor.                                                                                                                         | | ` `[String](https://developer.android.com/reference/java/lang/String)          | ` `[toString](https://developer.android.com/reference/java/lang/Object#toString())`() ` Returns a string representation of the object.                                                                                                                                            | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait(long,%20int))`(long timeoutMillis, int nanos) ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*, or until a certain amount of real time has elapsed. | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait(long))`(long timeoutMillis) ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*, or until a certain amount of real time has elapsed.                   | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait())`() ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*.                                                                                             | ||

## Public constructors

### StampedLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public StampedLock ()
```

Creates a new lock, initially in unlocked state.

<br />

## Public methods

### asReadLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public Lock asReadLock ()
```

Returns a plain[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)view of this StampedLock in which the[Lock.lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lock())method is mapped to[readLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#readLock()), and similarly for other methods. The returned Lock does not support a[Condition](https://developer.android.com/reference/java/util/concurrent/locks/Condition); method[Lock.newCondition()](https://developer.android.com/reference/java/util/concurrent/locks/Lock#newCondition())throws`UnsupportedOperationException`.

<br />

|                                             Returns                                              ||
|---------------------------------------------------------------------------------|-----------------|
| [Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock) | the lock <br /> |

### asReadWriteLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public ReadWriteLock asReadWriteLock ()
```

Returns a[ReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock)view of this StampedLock in which the[ReadWriteLock.readLock()](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock#readLock())method is mapped to[asReadLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asReadLock()), and[ReadWriteLock.writeLock()](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock#writeLock())to[asWriteLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#asWriteLock()).

<br />

|                                                      Returns                                                       ||
|---------------------------------------------------------------------------------------------------|-----------------|
| [ReadWriteLock](https://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock) | the lock <br /> |

### asWriteLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public Lock asWriteLock ()
```

Returns a plain[Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock)view of this StampedLock in which the[Lock.lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lock())method is mapped to[writeLock()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#writeLock()), and similarly for other methods. The returned Lock does not support a[Condition](https://developer.android.com/reference/java/util/concurrent/locks/Condition); method[Lock.newCondition()](https://developer.android.com/reference/java/util/concurrent/locks/Lock#newCondition())throws`UnsupportedOperationException`.

<br />

|                                             Returns                                              ||
|---------------------------------------------------------------------------------|-----------------|
| [Lock](https://developer.android.com/reference/java/util/concurrent/locks/Lock) | the lock <br /> |

### getReadLockCount

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public int getReadLockCount ()
```

Queries the number of read locks held for this lock. This method is designed for use in monitoring system state, not for synchronization control.

<br />

|                   Returns                   ||
|-------|--------------------------------------|
| `int` | the number of read locks held <br /> |

### isLockStamp

Added in[API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public static boolean isLockStamp (long stamp)
```

Tells whether a stamp represents holding a lock. This method may be useful in conjunction with[tryConvertToReadLock(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToReadLock(long))and[tryConvertToWriteLock(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToWriteLock(long)), for example:  

     long stamp = sl.tryOptimisticRead();
     try {
       ...
       stamp = sl.tryConvertToReadLock(stamp);
       ...
       stamp = sl.tryConvertToWriteLock(stamp);
       ...
     } finally {
       if (StampedLock.isLockStamp(stamp))
         sl.unlock(stamp);
     }

<br />

<br />

|                                  Parameters                                  ||
|---------|---------------------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a previous StampedLock operation <br /> |

|                                               Returns                                               ||
|-----------|------------------------------------------------------------------------------------------|
| `boolean` | `true`if the stamp was returned by a successful read-lock or write-lock operation <br /> |

### isOptimisticReadStamp

Added in[API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public static boolean isOptimisticReadStamp (long stamp)
```

Tells whether a stamp represents a successful optimistic read.

<br />

|                                  Parameters                                  ||
|---------|---------------------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a previous StampedLock operation <br /> |

|                                                                                                                                                                                                  Returns                                                                                                                                                                                                   ||
|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `boolean` | `true`if the stamp was returned by a successful optimistic read operation, that is, a non-zero return from[tryOptimisticRead()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryOptimisticRead())or[tryConvertToOptimisticRead(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToOptimisticRead(long)) <br /> |

### isReadLockStamp

Added in[API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public static boolean isReadLockStamp (long stamp)
```

Tells whether a stamp represents holding a lock non-exclusively. This method may be useful in conjunction with[tryConvertToReadLock(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToReadLock(long)), for example:  

     long stamp = sl.tryOptimisticRead();
     try {
       ...
       stamp = sl.tryConvertToReadLock(stamp);
       ...
     } finally {
       if (StampedLock.isReadLockStamp(stamp))
         sl.unlockRead(stamp);
     }

<br />

<br />

|                                  Parameters                                  ||
|---------|---------------------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a previous StampedLock operation <br /> |

|                                        Returns                                        ||
|-----------|----------------------------------------------------------------------------|
| `boolean` | `true`if the stamp was returned by a successful read-lock operation <br /> |

### isReadLocked

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public boolean isReadLocked ()
```

Returns`true`if the lock is currently held non-exclusively.

<br />

|                                Returns                                ||
|-----------|------------------------------------------------------------|
| `boolean` | `true`if the lock is currently held non-exclusively <br /> |

### isWriteLockStamp

Added in[API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public static boolean isWriteLockStamp (long stamp)
```

Tells whether a stamp represents holding a lock exclusively. This method may be useful in conjunction with[tryConvertToWriteLock(long)](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryConvertToWriteLock(long)), for example:  

     long stamp = sl.tryOptimisticRead();
     try {
       ...
       stamp = sl.tryConvertToWriteLock(stamp);
       ...
     } finally {
       if (StampedLock.isWriteLockStamp(stamp))
         sl.unlockWrite(stamp);
     }

<br />

<br />

|                                  Parameters                                  ||
|---------|---------------------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a previous StampedLock operation <br /> |

|                                        Returns                                         ||
|-----------|-----------------------------------------------------------------------------|
| `boolean` | `true`if the stamp was returned by a successful write-lock operation <br /> |

### isWriteLocked

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public boolean isWriteLocked ()
```

Returns`true`if the lock is currently held exclusively.

<br />

|                              Returns                              ||
|-----------|--------------------------------------------------------|
| `boolean` | `true`if the lock is currently held exclusively <br /> |

### readLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long readLock ()
```

Non-exclusively acquires the lock, blocking if necessary until available.

<br />

|                                Returns                                 ||
|--------|----------------------------------------------------------------|
| `long` | a read stamp that can be used to unlock or convert mode <br /> |

### readLockInterruptibly

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long readLockInterruptibly ()
```

Non-exclusively acquires the lock, blocking if necessary until available or the current thread is interrupted. Behavior under interruption matches that specified for method[Lock.lockInterruptibly()](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lockInterruptibly()).

<br />

|                                Returns                                 ||
|--------|----------------------------------------------------------------|
| `long` | a read stamp that can be used to unlock or convert mode <br /> |

|                                                                             Throws                                                                             ||
|------------------------------------------------------------------------------------------------|----------------------------------------------------------------|
| [InterruptedException](https://developer.android.com/reference/java/lang/InterruptedException) | if the current thread is interrupted before acquiring the lock |

### toString

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public String toString ()
```

Returns a string identifying this lock, as well as its lock state. The state, in brackets, includes the String`"Unlocked"`or the String`"Write-locked"`or the String`"Read-locks:"`followed by the current number of read-locks held.

<br />

|                                                               Returns                                                                ||
|--------------------------------------------------------------------|------------------------------------------------------------------|
| [String](https://developer.android.com/reference/java/lang/String) | a string identifying this lock, as well as its lock state <br /> |

### tryConvertToOptimisticRead

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryConvertToOptimisticRead (long stamp)
```

If the lock state matches the given stamp then, atomically, if the stamp represents holding a lock, releases it and returns an observation stamp. Or, if an optimistic read, returns it if validated. This method returns zero in all other cases, and so may be useful as a form of "tryUnlock".

<br />

|           Parameters            ||
|---------|------------------------|
| `stamp` | `long`: a stamp <br /> |

|                             Returns                              ||
|--------|----------------------------------------------------------|
| `long` | a valid optimistic read stamp, or zero on failure <br /> |

### tryConvertToReadLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryConvertToReadLock (long stamp)
```

If the lock state matches the given stamp, atomically performs one of the following actions. If the stamp represents holding a write lock, releases it and obtains a read lock. Or, if a read lock, returns it. Or, if an optimistic read, acquires a read lock and returns a read stamp only if immediately available. This method returns zero in all other cases.

<br />

|           Parameters            ||
|---------|------------------------|
| `stamp` | `long`: a stamp <br /> |

|                        Returns                        ||
|--------|-----------------------------------------------|
| `long` | a valid read stamp, or zero on failure <br /> |

### tryConvertToWriteLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryConvertToWriteLock (long stamp)
```

If the lock state matches the given stamp, atomically performs one of the following actions. If the stamp represents holding a write lock, returns it. Or, if a read lock, if the write lock is available, releases the read lock and returns a write stamp. Or, if an optimistic read, returns a write stamp only if immediately available. This method returns zero in all other cases.

<br />

|           Parameters            ||
|---------|------------------------|
| `stamp` | `long`: a stamp <br /> |

|                        Returns                         ||
|--------|------------------------------------------------|
| `long` | a valid write stamp, or zero on failure <br /> |

### tryOptimisticRead

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryOptimisticRead ()
```

Returns a stamp that can later be validated, or zero if exclusively locked.

<br />

|                                   Returns                                   ||
|--------|---------------------------------------------------------------------|
| `long` | a valid optimistic read stamp, or zero if exclusively locked <br /> |

### tryReadLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryReadLock ()
```

Non-exclusively acquires the lock if it is immediately available.

<br />

|                                                   Returns                                                    ||
|--------|------------------------------------------------------------------------------------------------------|
| `long` | a read stamp that can be used to unlock or convert mode, or zero if the lock is not available <br /> |

### tryReadLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryReadLock (long time, 
                TimeUnit unit)
```

Non-exclusively acquires the lock if it is available within the given time and the current thread has not been interrupted. Behavior under timeout and interruption matches that specified for method[Lock.tryLock(long,TimeUnit)](https://developer.android.com/reference/java/util/concurrent/locks/Lock#tryLock(long,%20java.util.concurrent.TimeUnit)).

<br />

|                          Parameters                           ||
|--------|-------------------------------------------------------|
| `time` | `long`: the maximum time to wait for the lock <br />  |
| `unit` | `TimeUnit`: the time unit of the`time`argument <br /> |

|                                                   Returns                                                    ||
|--------|------------------------------------------------------------------------------------------------------|
| `long` | a read stamp that can be used to unlock or convert mode, or zero if the lock is not available <br /> |

|                                                                             Throws                                                                             ||
|------------------------------------------------------------------------------------------------|----------------------------------------------------------------|
| [InterruptedException](https://developer.android.com/reference/java/lang/InterruptedException) | if the current thread is interrupted before acquiring the lock |

### tryUnlockRead

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public boolean tryUnlockRead ()
```

Releases one hold of the read lock if it is held, without requiring a stamp value. This method may be useful for recovery after errors.

<br />

|                            Returns                            ||
|-----------|----------------------------------------------------|
| `boolean` | `true`if the read lock was held, else false <br /> |

### tryUnlockWrite

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public boolean tryUnlockWrite ()
```

Releases the write lock if it is held, without requiring a stamp value. This method may be useful for recovery after errors.

<br />

|                         Returns                          ||
|-----------|-----------------------------------------------|
| `boolean` | `true`if the lock was held, else false <br /> |

### tryWriteLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryWriteLock ()
```

Exclusively acquires the lock if it is immediately available.

<br />

|                                                    Returns                                                    ||
|--------|-------------------------------------------------------------------------------------------------------|
| `long` | a write stamp that can be used to unlock or convert mode, or zero if the lock is not available <br /> |

### tryWriteLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long tryWriteLock (long time, 
                TimeUnit unit)
```

Exclusively acquires the lock if it is available within the given time and the current thread has not been interrupted. Behavior under timeout and interruption matches that specified for method[Lock.tryLock(long,TimeUnit)](https://developer.android.com/reference/java/util/concurrent/locks/Lock#tryLock(long,%20java.util.concurrent.TimeUnit)).

<br />

|                          Parameters                           ||
|--------|-------------------------------------------------------|
| `time` | `long`: the maximum time to wait for the lock <br />  |
| `unit` | `TimeUnit`: the time unit of the`time`argument <br /> |

|                                                    Returns                                                    ||
|--------|-------------------------------------------------------------------------------------------------------|
| `long` | a write stamp that can be used to unlock or convert mode, or zero if the lock is not available <br /> |

|                                                                             Throws                                                                             ||
|------------------------------------------------------------------------------------------------|----------------------------------------------------------------|
| [InterruptedException](https://developer.android.com/reference/java/lang/InterruptedException) | if the current thread is interrupted before acquiring the lock |

### unlock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public void unlock (long stamp)
```

If the lock state matches the given stamp, releases the corresponding mode of the lock.

<br />

|                          Parameters                          ||
|---------|-----------------------------------------------------|
| `stamp` | `long`: a stamp returned by a lock operation <br /> |

|                                                                                   Throws                                                                                   ||
|----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|
| [IllegalMonitorStateException](https://developer.android.com/reference/java/lang/IllegalMonitorStateException) | if the stamp does not match the current state of this lock |

### unlockRead

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public void unlockRead (long stamp)
```

If the lock state matches the given stamp, releases the non-exclusive lock.

<br />

|                            Parameters                             ||
|---------|----------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a read-lock operation <br /> |

|                                                                                   Throws                                                                                   ||
|----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|
| [IllegalMonitorStateException](https://developer.android.com/reference/java/lang/IllegalMonitorStateException) | if the stamp does not match the current state of this lock |

### unlockWrite

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public void unlockWrite (long stamp)
```

If the lock state matches the given stamp, releases the exclusive lock.

<br />

|                             Parameters                             ||
|---------|-----------------------------------------------------------|
| `stamp` | `long`: a stamp returned by a write-lock operation <br /> |

|                                                                                   Throws                                                                                   ||
|----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|
| [IllegalMonitorStateException](https://developer.android.com/reference/java/lang/IllegalMonitorStateException) | if the stamp does not match the current state of this lock |

### validate

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public boolean validate (long stamp)
```

Returns true if the lock has not been exclusively acquired since issuance of the given stamp. Always returns false if the stamp is zero. Always returns true if the stamp represents a currently held lock. Invoking this method with a value not obtained from[tryOptimisticRead()](https://developer.android.com/reference/java/util/concurrent/locks/StampedLock#tryOptimisticRead())or a locking method for this lock has no defined effect or result.

<br />

|           Parameters            ||
|---------|------------------------|
| `stamp` | `long`: a stamp <br /> |

|                                                       Returns                                                       ||
|-----------|----------------------------------------------------------------------------------------------------------|
| `boolean` | `true`if the lock has not been exclusively acquired since issuance of the given stamp; else false <br /> |

### writeLock

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long writeLock ()
```

Exclusively acquires the lock, blocking if necessary until available.

<br />

|                                 Returns                                 ||
|--------|-----------------------------------------------------------------|
| `long` | a write stamp that can be used to unlock or convert mode <br /> |

### writeLockInterruptibly

Added in[API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public long writeLockInterruptibly ()
```

Exclusively acquires the lock, blocking if necessary until available or the current thread is interrupted. Behavior under interruption matches that specified for method[Lock.lockInterruptibly()](https://developer.android.com/reference/java/util/concurrent/locks/Lock#lockInterruptibly()).

<br />

|                                 Returns                                 ||
|--------|-----------------------------------------------------------------|
| `long` | a write stamp that can be used to unlock or convert mode <br /> |

|                                                                             Throws                                                                             ||
|------------------------------------------------------------------------------------------------|----------------------------------------------------------------|
| [InterruptedException](https://developer.android.com/reference/java/lang/InterruptedException) | if the current thread is interrupted before acquiring the lock |