public class ReentrantLock extends Object implements Lock, Serializable
Lock
具有与使用synchronized
方法和语句访问的隐式监视锁相同的基本行为和语义,但具有扩展功能。
A 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)
|
void |
unlock()
尝试释放此锁。
|
public ReentrantLock()
ReentrantLock
的实例。
这相当于使用ReentrantLock(false)
。
public ReentrantLock(boolean fair)
ReentrantLock
的实例。
fair
-
true
如果此锁应使用合理的订购策略
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
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
false
public boolean isLocked()
true
如果有任何线程持有这个锁,
false
false
public final boolean isFair()
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
- 如果条件为空