public class ReentrantLock
extends Object
implements Lock, Serializable
java.lang.Object | |
↳ | java.util.concurrent.locks.ReentrantLock |
可重入的互斥 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
从锁定方法中抛出。
Public constructors |
|
---|---|
ReentrantLock() 创建一个 |
|
ReentrantLock(boolean fair) 使用给定的公平策略创建一个 |
Public methods |
|
---|---|
int |
getHoldCount() 查询当前线程在该锁上的保留数量。 |
final int |
getQueueLength() 返回等待获取此锁的线程数的估计值。 |
int |
getWaitQueueLength(Condition condition) 返回等待与此锁关联的给定条件的线程数的估计值。 |
final boolean |
hasQueuedThread(Thread thread) 查询给定线程是否正在等待获取此锁。 |
final boolean |
hasQueuedThreads() 查询是否有线程正在等待获取此锁。 |
boolean |
hasWaiters(Condition condition) 查询是否有线程正在等待与此锁相关的给定条件。 |
final boolean |
isFair() 如果此锁定公平设置为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() 试图释放此锁。 |
Protected methods |
|
---|---|
Thread |
getOwner() 返回当前拥有此锁定的线程,如果不是,则返回 |
Collection<Thread> |
getQueuedThreads() 返回包含可能正在等待获取此锁的线程的集合。 |
Collection<Thread> |
getWaitingThreads(Condition condition) 返回包含那些可能正在等待与此锁相关的给定条件的线程的集合。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface java.util.concurrent.locks.Lock
|
ReentrantLock ()
创建一个ReentrantLock
的实例。 这相当于使用ReentrantLock(false)
。
ReentrantLock (boolean fair)
使用给定的公平策略创建 ReentrantLock
的实例。
Parameters | |
---|---|
fair |
boolean : true if this lock should use a fair ordering policy |
int getHoldCount ()
查询当前线程在该锁上的保留数量。
一个线程对每个锁定操作都有一个锁定,而不是通过解锁操作进行匹配。
保持计数信息通常仅用于测试和调试目的。 例如,如果某段代码不应该与已经存在的锁一起输入,那么我们可以断言:
class X {
ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
assert lock.getHoldCount() == 0;
lock.lock();
try {
// ... method body
} finally {
lock.unlock();
}
}
}
Returns | |
---|---|
int |
the number of holds on this lock by the current thread, or zero if this lock is not held by the current thread |
int getQueueLength ()
返回等待获取此锁的线程数的估计值。 该值仅为估计值,因为在此方法遍历内部数据结构时,线程数可能会动态变化。 此方法设计用于监视系统状态,而不是用于同步控制。
Returns | |
---|---|
int |
the estimated number of threads waiting for this lock |
int getWaitQueueLength (Condition condition)
返回等待与此锁关联的给定条件的线程数的估计值。 请注意,因为超时和中断可能随时发生,所以估计仅作为服务员实际数量的上限。 此方法设计用于监视系统状态,而不是用于同步控制。
Parameters | |
---|---|
condition |
Condition : the condition |
Returns | |
---|---|
int |
the estimated number of waiting threads |
Throws | |
---|---|
IllegalMonitorStateException |
if this lock is not held |
IllegalArgumentException |
if the given condition is not associated with this lock |
NullPointerException |
if the condition is null |
boolean hasQueuedThread (Thread thread)
查询给定线程是否正在等待获取此锁。 请注意,因为取消可能随时发生, true
返回true
并不能保证此线程将获得此锁定。 此方法主要用于监视系统状态。
Parameters | |
---|---|
thread |
Thread : the thread |
Returns | |
---|---|
boolean |
true if the given thread is queued waiting for this lock |
Throws | |
---|---|
NullPointerException |
if the thread is null |
boolean hasQueuedThreads ()
查询是否有线程正在等待获取此锁。 请注意,因为取消可能随时发生,所以true
返回不能保证任何其他线程都会获取此锁。 此方法主要用于监视系统状态。
Returns | |
---|---|
boolean |
true if there may be other threads waiting to acquire the lock |
boolean hasWaiters (Condition condition)
查询是否有线程正在等待与此锁相关的给定条件。 请注意,因为超时和中断可能随时发生,所以true
返回不能保证将来signal
将唤醒任何线程。 此方法主要用于监视系统状态。
Parameters | |
---|---|
condition |
Condition : the condition |
Returns | |
---|---|
boolean |
true if there are any waiting threads |
Throws | |
---|---|
IllegalMonitorStateException |
if this lock is not held |
IllegalArgumentException |
if the given condition is not associated with this lock |
NullPointerException |
if the condition is null |
boolean isFair ()
如果此锁定公平设置为true,则返回 true
。
Returns | |
---|---|
boolean |
true if this lock has fairness set true |
boolean isHeldByCurrentThread ()
查询此锁是否由当前线程保存。
类似于内置监视器锁的方法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();
}
}
}
Returns | |
---|---|
boolean |
true if current thread holds this lock and false otherwise |
boolean isLocked ()
查询这个锁是否被任何线程持有。 此方法设计用于监视系统状态,而不是用于同步控制。
Returns | |
---|---|
boolean |
true if any thread holds this lock and false otherwise |
void lock ()
获取锁定。
如果该锁没有被另一个线程占用并且立即返回,则获取该锁,将锁定保持计数设置为1。
如果当前线程已经保存了锁,那么保持计数会加1,并且该方法立即返回。
如果锁由另一个线程保存,则当前线程因为线程调度目的而变为禁用状态,并处于休眠状态,直到获取锁,此时锁定保持计数设置为1。
void lockInterruptibly ()
获取锁定,除非当前线程为 interrupted 。
如果该锁没有被另一个线程占用并且立即返回,则获取该锁,将锁定保持计数设置为1。
如果当前线程已经保存了这个锁,那么保持计数加1,并且该方法立即返回。
如果锁由另一个线程保存,则当前线程因为线程调度目的而被禁用,并且处于休眠状态,直到发生以下两件事之一:
如果锁由当前线程获取,则锁定保持计数设置为1。
如果当前线程:
InterruptedException
is thrown and the current thread's interrupted status is cleared.
在这个实现中,由于这个方法是一个明确的中断点,因此优先考虑响应正常或重入锁的中断。
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted |
Condition newCondition ()
返回 Condition
实例支持相同的用途为做 Object
监视器方法( wait
, notify
,并 notifyAll
与使用时)内置监视器锁定。
Condition
waiting or signalling methods are called, then an IllegalMonitorStateException
is thrown. InterruptedException
will be thrown, and the thread's interrupted status will be cleared. Returns | |
---|---|
Condition |
the Condition object |
String toString ()
返回标识此锁定的字符串以及其锁定状态。 括号中的状态包括字符串"Unlocked"
或字符串"Locked by"
后面跟随拥有线程的name 。
Returns | |
---|---|
String |
a string identifying this lock, as well as its lock state |
boolean tryLock ()
只有在调用时它未被另一个线程占用的情况下才会获取该锁。
如果该锁未被另一个线程true
,则获取锁,并立即返回值true
,将锁定保持计数设置为1。 即使这个锁被设置为使用公平的订购策略,对tryLock()
的调用也会立即获得该锁(如果该锁可用),无论其他线程当前是否正在等待锁定。 这种“bar”“行为在某些情况下可能会有用,即使它违背公平。 如果您想要遵守此锁的公平性设置,请使用tryLock(0, TimeUnit.SECONDS)
,它几乎相同(它也会检测到中断)。
如果当前线程已经拥有此锁,则保持计数将加1并且方法返回 true
。
如果锁由另一个线程保存,则此方法将立即返回值 false
。
Returns | |
---|---|
boolean |
true if the lock was free and was acquired by the current thread, or the lock was already held by the current thread; and false otherwise |
boolean tryLock (long timeout, TimeUnit unit)
如果它在给定的等待时间内没有被另一个线程 占用 ,并且当前线程不是 interrupted ,则获取该锁。
如果该锁没有被另一个线程true
,则获取该锁,并立即返回值true
,将锁定保持计数设置为1。 如果此锁已设置为使用公平的订购策略,那么如果有其他线程正在等待锁, 则不会获取可用的锁。 这与tryLock()
方法相反。 如果你想要一个允许公平锁定的定时tryLock
,那么将定时和tryLock
表格组合在一起:
if (lock.tryLock() ||
lock.tryLock(timeout, unit)) {
...
}
如果当前线程已经拥有此锁定,则保持计数会加1,并返回 true
。
如果锁由另一个线程保存,则当前线程因为线程调度目的而被禁用,并且处于休眠状态,直到发生三件事之一:
如果获取锁定,则返回值 true
,并将锁定保持计数设置为1。
如果当前线程:
InterruptedException
is thrown and the current thread's interrupted status is cleared.
如果经过了指定的等待时间,则返回值false
。 如果时间小于或等于零,该方法将不会等待。
在该实现中,由于该方法是明确的中断点,因此优先考虑响应正常或重入锁获取的中断,并报告等待时间的过去。
Parameters | |
---|---|
timeout |
long : the time to wait for the lock |
unit |
TimeUnit : the time unit of the timeout argument |
Returns | |
---|---|
boolean |
true if the lock was free and was acquired by the current thread, or the lock was already held by the current thread; and false if the waiting time elapsed before the lock could be acquired |
Throws | |
---|---|
InterruptedException |
if the current thread is interrupted |
NullPointerException |
if the time unit is null |
void unlock ()
试图释放此锁。
如果当前线程是该锁的持有者,则保持计数递减。 如果保持计数现在为零,则锁定被释放。 如果当前线程不是该锁的持有者,则抛出IllegalMonitorStateException
。
Throws | |
---|---|
IllegalMonitorStateException |
if the current thread does not hold this lock |
Thread getOwner ()
返回当前拥有此锁的线程,如果不是,则返回null
。 当此方法由非所有者的线程调用时,返回值反映当前锁状态的尽力而为的近似值。 例如,即使有线程试图获取锁但尚未这样做,拥有者也可能暂时为null
。 该方法旨在便于建造提供更广泛锁定监控设施的子类。
Returns | |
---|---|
Thread |
the owner, or null if not owned |
Collection<Thread> getQueuedThreads ()
返回包含可能正在等待获取此锁的线程的集合。 因为实际的一组线程可能会在构造这个结果时动态地改变,所以返回的集合只是一个尽力而为的估计。 返回的集合的元素没有特定的顺序。 该方法旨在促进提供更广泛监测设施的子类的构建。
Returns | |
---|---|
Collection<Thread> |
the collection of threads |
Collection<Thread> getWaitingThreads (Condition condition)
返回包含那些可能正在等待与此锁相关的给定条件的线程的集合。 因为实际的一组线程可能会在构造这个结果时动态地改变,所以返回的集合只是一个尽力而为的估计。 返回的集合的元素没有特定的顺序。 这种方法旨在促进提供更广泛的状态监测设施的子类的构建。
Parameters | |
---|---|
condition |
Condition : the condition |
Returns | |
---|---|
Collection<Thread> |
the collection of threads |
Throws | |
---|---|
IllegalMonitorStateException |
if this lock is not held |
IllegalArgumentException |
if the given condition is not associated with this lock |
NullPointerException |
if the condition is null |