- java.lang.Object
-
- java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
-
- All Implemented Interfaces:
-
Serializable
,Lock
- Enclosing class:
- ReentrantReadWriteLock
public static class ReentrantReadWriteLock.WriteLock extends Object implements Lock, Serializable
该锁由方法ReentrantReadWriteLock.writeLock()
返回。- 另请参见:
- Serialized Form
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
WriteLock(ReentrantReadWriteLock lock)
子类使用的构造方法。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 int
getHoldCount()
查询当前线程对此写锁定的暂停数量。boolean
isHeldByCurrentThread()
查询这个写锁是否由当前线程持有。void
lock()
获取写锁。void
lockInterruptibly()
获取写锁定,除非当前线程为 interrupted 。Condition
newCondition()
String
toString()
返回一个标识此锁的字符串以及其锁定状态。boolean
tryLock()
只有在调用时没有被另一个线程占用才能获取写入锁。boolean
tryLock(long timeout, TimeUnit unit)
如果在给定的等待时间内没有被另一个线程 占用并且当前线程尚未被 interrupted获取写入锁定。void
unlock()
尝试释放此锁。
-
-
-
构造方法详细信息
-
WriteLock
protected WriteLock(ReentrantReadWriteLock lock)
子类使用的构造方法。- 参数
-
lock
- 外锁对象 - 异常
-
NullPointerException
- 如果锁为空
-
-
方法详细信息
-
lock
public void lock()
获取写锁。如果读锁定和写锁定都不被另一个线程保持并且立即返回,则将获取写锁定,将写锁定保持计数设置为1。
如果当前线程已经保持写锁定,则保持计数增加1,该方法立即返回。
如果锁被另一个线程保持,那么当前线程将被禁用以进行线程调度,并且处于休眠状态,直到获取写入锁定为止,此时写锁定保持计数设置为1。
-
lockInterruptibly
public void lockInterruptibly() throws InterruptedException
获取写锁定,除非当前线程为interrupted 。如果读锁定和写锁定都不被另一个线程保持并且立即返回,则将获取写锁定,将写锁定保持计数设置为1。
如果当前线程已经保存此锁,则保持计数将递增1,该方法立即返回。
如果锁被另一个线程保持,则当前线程将被禁用以进行线程调度,并且处于休眠状态,直到发生两件事情之一:
- 写锁由当前线程获取; 要么
- 一些其他线程interrupts当前线程。
如果当前线程获取了写入锁定,则锁定保持计数被设置为1。
如果当前线程:
- 在进入该方法时设置了中断状态; 要么
- 是interrupted同时获取写锁,
InterruptedException
并清除当前线程的中断状态。在该实现中,由于该方法是明确的中断点,所以优先考虑通过锁定正常或可重入的采集来响应中断。
- Specified by:
-
lockInterruptibly
在接口Lock
- 异常
-
InterruptedException
- 当前线程是否中断
-
tryLock
public boolean tryLock()
只有在调用时没有被另一个线程占用才能获取写入锁。如果读锁定和写锁定都不被另一个线程保持,并且立即返回值
true
,将写锁定保持计数设置为1,则获取写入锁定。 即使该锁已设置为使用公平的订购策略,如果可用的话,呼叫tryLock()
将立即获取锁定,无论其他线程是否正在等待写锁定。 这种“趸船”行为在某些情况下是有用的,尽管它打破了公平。 如果要遵守该锁的公平性设置,则使用几乎相当的tryLock(0, TimeUnit.SECONDS)
(也检测到中断)。如果当前线程已经保存该锁,则保持计数增加1,该方法返回
true
。如果锁由另一个线程持有,则该方法将立即返回值为
false
。
-
tryLock
public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
如果在给定的等待时间内没有被另一个线程占用 ,并且当前线程尚未被interrupted采集写锁定。如果读锁定和写锁定都不被另一个线程保持并且立即返回值
true
,将写锁定保持计数设置为1,则获取写入锁定。 如果此锁已设置为使用合理的排序策略,则如果其他任何线程正在等待写锁定, 则不会获取可用的锁。 这与tryLock()
方法相反。 如果你想要一个定时的tryLock
,允许在公平的锁定驳船,那么将定时和不定时的形式结合在一起:if (lock.tryLock() || lock.tryLock(timeout, unit)) { ... }
如果当前线程已经保存该锁,则保持计数增加1,该方法返回
true
。如果锁被另一个线程保持,则当前线程将被禁用以进行线程调度,并且处于休眠状态,直至发生三件事情之一:
- 写锁由当前线程获取; 要么
- 一些其他线程当前线程interrupts ; 要么
- 指定的等待时间过去了
如果获取了写锁定,则返回值
true
,并将写锁定保持计数设置为1。如果当前线程:
- 在进入该方法时设置了中断状态; 要么
- 是interrupted同时获取写锁,
InterruptedException
并清除当前线程的中断状态。如果指定的等待时间过去,则返回值
false
。 如果时间小于或等于零,该方法根本不会等待。在这种实现中,由于该方法是明确的中断点,所以优先考虑响应中断超过正常或可重入的锁的获取,并且报告等待时间的过去。
- Specified by:
-
tryLock
在接口Lock
- 参数
-
timeout
- 等待写锁的时间 -
unit
- 超时参数的时间单位 - 结果
-
true
如果锁是空闲的并且被当前线程获取,或者写锁已经被当前线程保持; 和false
如果在获得锁之前经过的等待时间。 - 异常
-
InterruptedException
- 当前线程是否中断 -
NullPointerException
- 如果时间单位为空
-
unlock
public void unlock()
尝试释放此锁。如果当前线程是该锁的持有者,则保持计数递减。 如果保持计数现在为零,则锁定被释放。 如果当前线程不是该锁的持有者,则抛出
IllegalMonitorStateException
。- Specified by:
-
unlock
在接口Lock
- 异常
-
IllegalMonitorStateException
- 如果当前线程不持有此锁
-
newCondition
public Condition newCondition()
返回Condition
与此使用实例Lock
实例。返回
Condition
实例支持相同的用途为做Object
种监视器方法(wait
,notify
,并notifyAll
与使用时)内置监视器锁定。- 如果在调用任何
Condition
方法时不保留此写锁定,则抛出IllegalMonitorStateException
。 (读取锁定与写入锁定无关,因此不会被检查或受到影响,但是当当前线程也获取了读锁定时,它本质上总是调用条件等待方法的错误,因为可以解除阻塞的其他线程不会能够获取写锁。) - 当条件waiting方法被调用时,写锁定被释放,在它们返回之前,重新获取写入锁定,并且锁定保持计数恢复为调用该方法时的值。
- 如果一个线程是interrupted,而等待,那么等待将终止,一个
InterruptedException
将被抛出,线程的中断状态将被清除。 - 等待线程以FIFO顺序发出信号。
- 从等待方法返回的线程的锁重新获取的顺序与初始获取锁的线程相同,这在默认情况下未指定,但是对于公平的锁有利于那些等待最长的线程。
- Specified by:
-
newCondition
在接口Lock
- 结果
- Condition对象
- 如果在调用任何
-
isHeldByCurrentThread
public boolean isHeldByCurrentThread()
查询这个写锁是否由当前线程持有。 相同于ReentrantReadWriteLock.isWriteLockedByCurrentThread()
。- 结果
-
true
如果当前线程持有该锁,否则为false
- 从以下版本开始:
- 1.6
-
getHoldCount
public int getHoldCount()
- 结果
- 当前线程对此锁定的保持次数,如果此锁定不由当前线程保持,则为零
- 从以下版本开始:
- 1.6
-
-