跳到主要内容

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的优势主要有以下几点:

  1. 灵活性Lock接口提供了更多的灵活性,可以在运行时决定是否要获取锁,以及何时释放锁。而synchronized则会在进入和退出代码块时自动获取和释放锁。
  2. 可中断性Lock接口中的lockInterruptibly()方法允许线程在等待获取锁的过程中被中断,而synchronized则不支持这个特性。
  3. 公平性Lock接口可以通过公平锁实现公平访问,即等待时间最长的线程将优先获得锁。而synchronized无法保证这一点。
  4. 条件变量Lock接口可以配合Condition对象使用,实现更复杂的线程同步逻辑。而synchronized只提供了基本的等待/通知机制。

总的来说,Lock接口提供了比synchronized更强大、更灵活的线程同步机制,适用于需要更复杂同步逻辑的场景。然而,它也需要更多的代码和更复杂的逻辑来实现,所以在不需要这些额外特性的情况下,使用synchronized可能更简单、更直观。