public interface Lock
Lock
实现提供了比使用 synchronized
方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的Condition
对象。
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如ReadWriteLock
的读取锁。
方法详细信息 |
---|
void lock()
-
获取锁。
如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
实现注意事项
Lock
实现可能能够检测到锁的错误使用,比如会导致死锁的调用,在那种环境下还可能抛出一个 (unchecked) 异常。Lock
实现必须对环境和异常类型进行记录。
void lockInterruptibly() throws InterruptedException
-
如果当前线程未被
中断,则获取锁。
如果锁可用,则获取锁,并立即返回。
如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:
- 锁由当前线程获得;或者
- 其他某个线程中断当前线程,并且支持对锁获取的中断。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在获取锁时被中断,并且支持对锁获取的中断,
InterruptedException
,并清除当前线程的已中断状态。
boolean tryLock()
-
仅在调用时锁为空闲状态才获取该锁。
如果锁可用,则获取锁,并立即返回值
true
。如果锁不可用,则此方法将立即返回值false
。
boolean tryLock(long time, TimeUnit unit) throws InterruptedException
-
如果锁在给定的等待时间内空闲,并且当前线程未被
中断,则获取锁。
如果锁可用,则此方法将立即返回值
true
。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:- 锁由当前线程获得;或者
- 其他某个线程中断当前线程,并且支持对锁获取的中断;或者
- 已超过指定的等待时间
如果获得了锁,则返回值
true
。如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在获取锁时被中断,并且支持对锁获取的中断,
InterruptedException
,并会清除当前线程的已中断状态。如果超过了指定的等待时间,则将返回值
false
。如果 time 小于等于 0,该方法将完全不等待。 -
-
参数:
-
time
- 等待锁的最长时间unit
-time
参数的时间单位
-
void unlock()
-
释放锁。
实现注意事项
Lock
实现通常对哪个线程可以释放锁施加了限制(通常只有锁的保持者可以释放它),如果违背了这个限制,可能会抛出(未经检查的)异常。该Lock
实现必须对所有限制和异常类型进行记录。
Condition newCondition()
-
返回绑定到此
Lock
实例的新Condition
实例。在等待条件前,锁必须由当前线程保持。调用
Condition.await()
将在等待前以原子方式释放锁,并在等待返回前重新获取锁。实现注意事项
Condition
实例的具体操作依赖于Lock
实现,并且该实现必须对此加以记录。
public class LockInfo extends Object
关于锁 的信息。锁可以是内置对象监视器、可拥有同步器 (ownable synchronizer) 或与同步器关联的 Condition
对象。
可拥有同步器是可以由一个线程独占的同步器,使用 AbstractOwnableSynchronizer
(或其子类)来实现其同步属性。ReentrantLock
和ReentrantReadWriteLock
是平台提供的两个可拥有同步器示例。
public class LockSupport extends Object
用来创建锁和其他同步类的基本线程阻塞原语。
此类以及每个使用它的线程与一个许可关联(从 Semaphore
类的意义上说)。如果该许可可用,并且可在进程中使用,则调用 park
将立即返回;否则可能 阻塞。如果许可尚不可用,则可以调用 unpark
使其可用。(但与 Semaphore 不同的是,许可不能累积,并且最多只能有一个许可。)
static Object | getBlocker(Thread t) 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。 |
static void | park() 为了线程调度,禁用当前线程,除非许可可用。 |
static void | park(Object blocker) 为了线程调度,在许可可用之前禁用当前线程。 |
static void | parkNanos(long nanos) 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。 |
static void | parkNanos(Object blocker, long nanos) 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。 |
static void | parkUntil(long deadline) 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。 |
static void | parkUntil(Object blocker, long deadline) 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。 |
static void | unpark(Thread thread) 如果给定线程的许可尚不可用,则使其可用。 |