如果另一个线程在给定的等待时间内没有保持写入锁,并且当前线程未被中断,则获取写入锁。
如果另一个线程既没有保持读取锁也没有保持写入锁,则获取写入锁并立即返回 true
值,并将写入锁保持计数设置为 1。如果为了使用公平的排序策略,已经设置此锁,并且其他线程都在等待写入锁,则不会 获取一个可用的锁。这与 trylock()
方法相反。如果想使用一个允许闯入公平锁的定时 trylock
,那么可以将定时形式和不定时形式组合在一起:
if (lock.trylock() || lock.trylock(timeout, unit) ) { ... }
如果当前线程已经保持此锁,则将保持计数加 1,该方法将返回 true
。
如果锁被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下三种情况之一以前,该线程将一直处于休眠状态:
- 写入锁由当前线程获得;或者
- 其他某个线程中断当前线程;或者
- 已超过指定的等待时间
如果获取了写入锁,则返回 true
值,并将写入锁保持计数设置为 1。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在获取写入锁的同时被中断。
则抛出 interruptedexception
,并且清除当前线程的已中断状态。
如果超出了指定的等待时间,则返回值为 false
。如果该时间小于等于 0,则此方法根本不会等待。
在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁的普通获取或重入获取,或者报告所用的等待时间。
- 指定者:
- 接口
lock
中的 trylock
- 参数:
timeou
- 等待写入锁的时间unit
- timeout 参数的时间单位
- 返回:
- 如果锁是自由的并且由当前线程获取,或者当前线程已经保持写入锁,则返回
true
;如果在获取该锁之前已经到达等待时间,则返回 false
。
- 抛出:
interruptedexception
- 如果当前线程被中断
nullpointerexception
- 如果时间单位为 null