public class ReentrantLock extends Object implements Lock, Serializable
Lock
具有相同的基本行为和语义为隐式监控锁使用
synchronized
方法和报表访问,但扩展功能。
一个ReentrantLock
是由线程最后成功锁定,但尚未解锁它。一个线程调用lock
将返回,成功获取锁,当锁不是由另一个线程拥有。如果当前线程已经拥有锁,该方法将立即返回。这可以使用方法isHeldByCurrentThread()
检查,并getHoldCount()
。
此类的构造函数接受一个可选的公平性参数。当设置true
,争,锁青睐授予访问最长等待线程。否则,此锁不保证任何特定的访问顺序。使用许多线程访问的公平锁的程序可能会显示较低的整体吞吐量(即,比那些使用默认设置慢,往往要慢得多),但有较小的差异,在时间获得锁和保证缺乏饥饿。请注意,锁的公平性并不能保证线程调度的公平性。因此,使用一个公平锁的许多线程之一可能会获得它的连续多次,而其他活动线程不进展,而不是目前持有的锁。还要注意,不定时的tryLock()
方法不尊重公平设置。如果锁是可用的,即使其他线程正在等待,它也会成功的。
这是推荐的做法总是紧跟一个电话lock
与try
块,最典型的是在前/后建设等:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
除了实现Lock
接口,这个类定义了用于检查锁的状态的一些public
和protected
方法。这些方法中的一些只是有用的仪器和监测。
这类的序列化的行为以同样的方式作为一个反序列化内置锁:锁处于解锁状态,无论其状态序列化时。
此锁支持同一线程的2147483647个递归锁的最大值。试图在Error
超过这个限制的结果将从锁定的方法。
Constructor and Description |
---|
ReentrantLock()
创建
ReentrantLock 实例。
|
ReentrantLock(boolean fair)
创建具有给定的公平政策
ReentrantLock 实例。
|
Modifier and Type | Method and Description |
---|---|
int |
getHoldCount()
查询当前线程在这个锁上的数目。
|
protected Thread |
getOwner()
返回该线程当前拥有该锁,或
null 如果不拥有。
|
protected Collection<Thread> |
getQueuedThreads()
返回一个包含可能等待获取此锁的线程的集合。
|
int |
getQueueLength()
返回等待获取此锁的线程数的估计值。
|
protected Collection<Thread> |
getWaitingThreads(Condition condition)
返回一个集合,包含可能在与此锁关联的给定条件下等待的线程集合。
|
int |
getWaitQueueLength(Condition condition)
返回在与此锁关联的给定条件下等待的线程数的估计值。
|
boolean |
hasQueuedThread(Thread thread)
查询给定线程是否正在等待获取此锁。
|
boolean |
hasQueuedThreads()
查询是否有任何线程等待获取此锁。
|
boolean |
hasWaiters(Condition condition)
查询是否有任何线程在与此锁关联的给定条件下等待。
|
boolean |
isFair()
返回
true 如果锁已经公平设置为true。
|
boolean |
isHeldByCurrentThread()
查询如果这个锁是由当前线程持有的。
|
boolean |
isLocked()
查询此锁是否由任何线程所持有。
|
void |
lock()
获取锁。
|
void |
lockInterruptibly()
获取该锁除非当前线程
interrupted。
|
Condition |
newCondition()
|
String |
toString()
返回一个确定此锁的字符串,以及它的锁状态。
|
boolean |
tryLock()
只有在调用时,它不是由另一个线程持有的锁。
|
boolean |
tryLock(long timeout, TimeUnit unit)
获取该锁如果不是由另一个线程在等待时间和当前线程没有被
interrupted。
|
void |
unlock()
试图释放这个锁。
|
public ReentrantLock()
ReentrantLock
实例。这相当于使用
ReentrantLock(false)
。
public ReentrantLock(boolean fair)
ReentrantLock
实例。
fair
-
true
如果锁应该用一个公平的订货策略
public void lock()
获取锁,如果它不是由另一个线程持有的,并立即返回,设置锁保持计数为一。
如果当前线程已经持有锁然后把计数递增的方法立即返回。
如果锁由另一个线程持有,那么当前线程成为禁用线程调度的目的,并处于休眠状态,直到锁已被收购,在这一时间的锁保持计数设置为一个。
public void lockInterruptibly() throws InterruptedException
获取锁,如果它不是由另一个线程持有的,并立即返回,设置锁保持计数为一。
如果当前线程已经持有这个锁然后把计数递增的方法立即返回。
如果锁是由另一个线程持有的,那么当前线程成为禁用线程调度的目的,并处于休眠状态,直到两个事情发生:
如果锁定是由当前线程获取的,那么锁定计数将被设置为一个。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
在这个实现中,这种方法是一种明确的中断点,优先响应中断超过正常或折返的锁的获取。
lockInterruptibly
接口
Lock
InterruptedException
-如果当前线程被中断
public boolean tryLock()
获取该锁如果不是由另一个线程并立即返回的值true
举行,设置锁持有数1。即使这把锁已设置为使用一个公平的订货政策,呼吁tryLock()
将立即如果它是可用的获取锁,是否有其他线程正在等待锁。这种“闯”的行为在某些情况下可能是有用的,即使它打破了公平。如果你想尊重公平这把锁的设置,然后使用tryLock(0, TimeUnit.SECONDS)
几乎是等价的(它也检测到中断)。
如果当前线程已经持有这个锁然后把计数递增的方法返回true
。
如果锁是由另一个线程然后这个方法会立即返回的值false
。
public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
获取该锁如果不是由另一个线程并立即返回的值true
举行,设置锁持有数1。如果这个锁已被设置为使用一个公平的订货政策,那么一个可用的锁将不会被收购,如果任何其他线程等待锁。与此形成对比的是,tryLock()
方法。如果你想要一个定时tryLock
不允许讨价还价在公平锁,然后结合定时和不定时的形式:
if (lock.tryLock() ||
lock.tryLock(timeout, unit)) {
...
}
如果当前线程已经持有这个锁然后把计数递增的方法返回true
。
如果锁由另一个线程持有,那么当前线程成为禁用线程调度的目的,并处于休眠状态,直到三个事情发生:
如果锁是后天再值true
返回并且锁持有数设置为一个。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
如果指定的等待时间的流逝,然后false
返回值。如果时间小于或等于零,该方法将不会等待在所有。
在这个实现中,这种方法是一种明确的中断点,优先响应中断超过正常或折返的锁的获取,并在报告的等待时间的流逝。
tryLock
接口
Lock
timeout
-时间等待锁
unit
- timeout参数的时间单位
true
如果锁是免费的,是由当前线程获取,或锁已被当前线程举行;和
false
如果等待的时间才可以获得的锁
InterruptedException
-如果当前线程被中断
NullPointerException
-如果时间单位为零
public void unlock()
如果当前线程持有这个锁然后把计数减少。如果保持计数现在为零,则释放锁。如果当前线程是不是这个锁持有者然后IllegalMonitorStateException
抛出。
unlock
接口
Lock
IllegalMonitorStateException
-如果当前线程不持有这个锁
public Condition newCondition()
Condition
实例使用这
Lock
实例。
返回的Condition
实例支持Object
监测方法做同样的用法(wait
,notify
,和notifyAll
)当使用内置监控锁。
Condition
waiting或signalling方法被调用,然后IllegalMonitorStateException
抛出。InterruptedException
将抛出,和线程的中断状态将被清除。newCondition
接口
Lock
public int getHoldCount()
线程有一个保持锁上的每个锁动作,不匹配的解锁动作。
保持计数信息通常只用于测试和调试的目的。例如,如果一个特定部分的代码不应该输入与锁已经举行,那么我们可以断言这一事实:
class X {
ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
assert lock.getHoldCount() == 0;
lock.lock();
try {
// ... method body
} finally {
lock.unlock();
}
}
}
public boolean isHeldByCurrentThread()
类似于Thread.holdsLock(Object)
内置监视器锁的方法,这种方法通常用于调试和测试。例如,一个方法,应该只被调用,而一个锁保持可以断言,这是这样:
class X {
ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
assert lock.isHeldByCurrentThread();
// ... method body
}
}
它也可以被用来确保入锁中使用不可重入的方式,例如:
class X {
ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
assert !lock.isHeldByCurrentThread();
lock.lock();
try {
// ... method body
} finally {
lock.unlock();
}
}
}
true
如果当前线程持有这个锁和
false
否则
public boolean isLocked()
true
如果任何线程持有的锁,否则这
false
public final boolean isFair()
true
如果锁已经公平设置为true。
true
如果锁已经公平设置为true
protected Thread getOwner()
null
如果不拥有。当这个方法被一个不是所有者的线程调用时,返回值反映了当前锁定状态的最佳努力近似值。例如,业主可以随时
null
即使有线程试图获取锁,但尚未这样做。这种方法的目的是方便的子类,提供更广泛的锁定监控设施的建设。
null
如果不拥有
public final boolean hasQueuedThreads()
true
返回不保证其他线程会获得这个锁。这种方法的设计主要是用于监测系统状态。
true
如果可能有其他线程等待获取锁
public final boolean hasQueuedThread(Thread thread)
true
回报并不保证该线程会获得这个锁。这种方法的设计主要是用于监测系统状态。
thread
-螺纹
true
如果给定线程排队等待这个锁
NullPointerException
-如果线程是无效的
public final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
true
收益并不能保证未来的
signal
将唤醒所有线程。这种方法的设计主要是用于监测系统状态。
condition
-条件
true
如果有任何等待的线程
IllegalMonitorStateException
-如果这锁不举行
IllegalArgumentException
-如果给定的条件是不是与此相关的锁
NullPointerException
-如果条件是空的
public int getWaitQueueLength(Condition condition)
condition
-条件
IllegalMonitorStateException
-如果这锁不举行
IllegalArgumentException
-如果给定的条件是不是与此相关的锁
NullPointerException
-如果条件是空的
protected Collection<Thread> getWaitingThreads(Condition condition)
condition
-条件
IllegalMonitorStateException
-如果这锁不举行
IllegalArgumentException
-如果给定的条件是不是与此相关的锁
NullPointerException
-如果条件是空的
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.