- java.lang.Object
-
- java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
-
- 实现的所有接口
-
Serializable
,Lock
- Enclosing class:
- ReentrantReadWriteLock
public static class ReentrantReadWriteLock.WriteLockextends Objectimplements Lock, Serializable
方法ReadWriteLock.writeLock()
返回的锁定。- 另请参见:
- Serialized Form
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
WriteLock(ReentrantReadWriteLock lock)
子类使用的构造方法。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 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
允许在公平锁定上进行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
in interfaceLock
- 结果
- Condition对象
- 如果在调用任何
-
toString
public String toString()
返回标识此锁的字符串及其锁定状态。 括号中的状态包括字符串"Unlocked"
或字符串"Locked by"
后跟拥有线程的name 。
-
isHeldByCurrentThread
public boolean isHeldByCurrentThread()
查询当前线程是否持有此写锁定。 与ReentrantReadWriteLock.isWriteLockedByCurrentThread()
完全相同 。- 结果
-
true
如果当前线程持有此锁,false
- 从以下版本开始:
- 1.6
-
getHoldCount
public int getHoldCount()
- 结果
- 当前线程锁定此锁定的次数,如果当前线程未保持此锁定,则为零
- 从以下版本开始:
- 1.6
-
-