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