Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?
参考答案:
Lock接口是Java并发包java.util.concurrent.locks中的一个重要部分,它提供了一种更灵活的线程同步机制。这个接口中的方法比synchronized关键字提供了更细粒度的控制,并且它提供了多种等待/通知模型。
Lock接口的主要方法包括:
void lock(): 获取锁。如果锁立即可用且未被其他线程持有,则获取该锁,如果锁不可用,则当前线程将被禁用,直到获得锁为止。boolean tryLock(): 尝试获取锁。如果锁立即可用且未被其他线程持有,则获取该锁。如果锁不可用,则此方法将返回false。boolean tryLock(long time, TimeUnit unit): 在给定的时间内尝试获取锁。如果在这段时间内锁变得可用且未被其他线程持有,则获取该锁。如果锁不可用,则当前线程将被禁用,直到获得锁或超时为止。void unlock(): 释放此锁。如果当前线程不持有此锁,则抛出IllegalMonitorStateException。
Lock接口相比于synchronized的优势主要有以下几点:
- 灵活性:
Lock接口提供了更多的灵活性,可以在运行时决定是否要获取锁,以及何时释放锁。而synchronized则会在进入和退出代码块时自动获取和释放锁。 - 可中断性:
Lock接口中的lockInterruptibly()方法允许线程在等待获取锁的过程中被中断,而synchronized则不支持这个特性。 - 公平性:
Lock接口可以通过公平锁实现公平访问,即等待时间最长的线程将优先获得锁。而synchronized无法保证这一点。 - 条件变量:
Lock接口可以配合Condition对象使用,实现更复杂的线程同步逻辑。而synchronized只提供了基本的等待/通知机制。
总的来说,Lock接口提供了比synchronized更强大、更灵活的线程同步机制,适用于需要更复杂同步逻辑的场景。然而,它也需要更多的代码和更复杂的逻辑来实现,所以在不需要这些额外特性的情况下,使用synchronized可能更简单、更直观。