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
可能更简单、更直观。