|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.Object java.util.concurrent.locks.ReentrantLock
public class ReentrantLock
一个可重入的互斥锁定 Lock
,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。
ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread()
和 getHoldCount()
方法来检查此情况是否发生。
此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁定倾向于将访问权授予等待时间最长的线程。否则此锁定将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁定)相比,使用公平锁定的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁定和保证锁定分配的均衡性时差异较小。不过要注意的是,公平锁定不能保证线程调度的公平性。因此,使用公平锁定的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁定时。还要注意的是,未定时的 tryLock
方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁定是可用的,此方法就可以获得成功。
建议总是 立即实践,使用 try 块来调用 lock,在之前/之后的构造中,最典型的代码如下:
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }
除了实现 Lock
接口,此类还定义了 isLocked 和 getLockQueueLength 方法,以及一些相关的 protected 访问方法,这些方法对检测和监视可能很有用。
该类的序列化与内置锁定的行为方式相同:一个反序列化的锁定处于解除锁定状态,不管它被序列化时的状态是怎样的。
此锁定最多支持同一个线程发起的 2147483648 个递归锁定。
构造方法摘要 | |
---|---|
ReentrantLock()
创建一个 ReentrantLock 的实例。 |
|
ReentrantLock(boolean fair)
创建一个具有给定公平策略的 ReentrantLock。 |
方法摘要 | |
---|---|
int |
getHoldCount()
查询当前线程保持此锁定的次数。 |
protected Thread |
getOwner()
返回目前拥有此锁定的线程,如果此锁定不被任何线程拥有,则返回 null。 |
protected Collection<Thread> |
getQueuedThreads()
返回一个 collection,它包含可能正等待获取此锁定的线程。 |
int |
getQueueLength()
返回正等待获取此锁定的线程估计数。 |
protected Collection<Thread> |
getWaitingThreads(Condition condition)
返回一个 collection,它包含可能正在等待与此锁定相关给定条件的那些线程。 |
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()
如果当前线程未被 中断 ,则获取锁定。 |
Condition |
newCondition()
返回用来与此 Lock 实例一起使用的 Condition 实例。 |
String |
toString()
返回标识此锁定及其锁定状态的字符串。 |
boolean |
tryLock()
仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定。 |
boolean |
tryLock(long timeout,
TimeUnit unit)
如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被 中断 ,则获取该锁定。 |
void |
unlock()
试图释放此锁定。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
public ReentrantLock()
public ReentrantLock(boolean fair)
fair
- 如果此锁定是公平的,则该参数为 true;否则为 false方法详细信息 |
---|
public void lock()
如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。
如果当前线程已经保持该锁定,则将保持计数加 1,并且该方法立即返回。
如果该锁定被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁定之前,该线程将一直处于休眠状态,此时锁定保持计数被设置为 1。
public void lockInterruptibly() throws InterruptedException
中断
,则获取锁定。
如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。
如果当前线程已经保持此锁定,则将保持计数加 1,并且该方法立即返回。
如果锁定被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:
中断
当前线程。
如果当前线程获得该锁定,则将锁定保持计数设置为 1。
如果当前线程:
中断
。
InterruptedException
,并且清除当前线程的已中断状态。
在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁定的普通获取或重入获取。
Lock
中的 lockInterruptibly
InterruptedException
- 如果当前线程已中断。Thread.interrupt()
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,那么可以将定时形式和不定时形式组合在一起:
if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
如果当前线程已经保持此锁定,则将保持计数加 1,该方法将返回 true。
如果锁定被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下三种情况之一以前,该线程将一直处于休眠状态:
中断
当前线程;或者
如果获得该锁定,则返回 true 值,并将锁定保持计数设置为 1。
如果当前线程:
中断
。
InterruptedException
,并且清除当前线程的已中断状态。
如果超出了指定的等待时间,则返回值为 false。如果该时间小于或等于 0,则此方法根本不会等待。
在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁定的普通获取或重入获取,或者报告所用的等待时间。
timeout
- 等待锁定的时间unit
- timeout 参数的时间单位
InterruptedException
- 如果当前线程被中断
NullPointerException
- 如果单位为 nullThread.interrupt()
public void unlock()
如果当前线程是此锁定所有者,则将保持计数减 1。如果保持计数现在为 0,则释放该锁定。如果当前线程不是此锁定的持有者,则抛出 IllegalMonitorStateException
。
IllegalMonitorStateException
- 如果当前线程没有保持此锁定。public Condition newCondition()
Lock
实例一起使用的 Condition
实例。
在使用内置监视器锁定时,返回的 Condition
实例支持与 Object
的监视器方法(wait
、notify
和 notifyAll
)相同的用法。
Condition
、waiting
或 signalling
这些方法中的任意一个方法时,如果没有保持此锁定,则将抛出 IllegalMonitorStateException
。
waiting
条件方法时,将释放锁定,并在这些方法返回之前,重新获取该锁定,将锁定保持计数恢复为调用方法时所持有的值。
InterruptedException
,清除线程的中断状态。
Lock
中的 newCondition
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(java.lang.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(); } } }
public boolean isLocked()
public final boolean isFair()
protected Thread getOwner()
public final boolean hasQueuedThreads()
public final boolean hasQueuedThread(Thread thread)
thread
- 线程
NullPointerException
- 如果 thread 为 null。public final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
condition
- 条件
IllegalMonitorStateException
- 如果没有保持此锁定
IllegalArgumentException
- 如果给定 condition 与此锁定无关
NullPointerException
- 如果 condition 为 nullpublic int getWaitQueueLength(Condition condition)
condition
- 条件
IllegalMonitorStateException
- 如果没有保持此锁定
IllegalArgumentException
- 如果给定 condition 与此锁定无关
NullPointerException
- 如果 condition 为 nullprotected Collection<Thread> getWaitingThreads(Condition condition)
condition
- 条件
IllegalMonitorStateException
- 如果没有保持此锁定
IllegalArgumentException
- 如果给定 condition 与此锁定无关
NullPointerException
- 如果 condition 为 nullpublic String toString()
Thread.getName()
。
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。