Java有了synchronized,为什么还要提供Lock


Java 中提供 synchronized 关键字和 Lock 接口的目的是为了实现多线程同步,但它们在实现上有一些区别,提供了不同的特性和灵活性。下面是一些使用 Lock 接口相对于 synchronized 关键字的优势:

  1. 可中断性:
    • Lock 提供了能够中断等待锁的线程的机制,通过 lockInterruptibly 方法可以实现对锁等待的中断操作。而使用 synchronized 时,等待锁的线程只能一直等待,无法被中断。
  2. 超时性:
    • Lock 可以在尝试获取锁时设置一个超时时间,通过 tryLock(long time, TimeUnit unit) 方法实现。这使得线程在一定时间内无法获取到锁时可以进行其他处理,而不是一直等待。而使用 synchronized 关键字时,线程只能一直等待锁的释放。
  3. 可重入性:
    • Lock 具备可重入性,允许线程在已经持有锁的情况下再次获取相同的锁,而 synchronized 关键字也具有可重入性,但是要求线程必须先释放锁才能再次获取。
  4. 多个条件(Condition):
    • Lock 接口提供了 Condition 类型,允许线程在等待某个条件时释放锁。这使得线程可以根据不同的条件进行等待和唤醒。而使用 synchronized 时,只能使用 waitnotify 方法,无法灵活地实现多个条件的等待。
  5. 公平性:
    • Lock 接口允许实现类支持公平锁,通过构造方法或配置,可以控制线程获取锁的公平性。而 synchronized 关键字的锁是非公平的,即不考虑等待时间,直接由操作系统决定下一个获取锁的线程。
  6. 性能:
    • 在某些情况下,Lock 的性能可能比 synchronized 更好。这是因为 Lock 提供了更细粒度的控制和更多的特性,但具体的性能差异可能会受到实现和使用方式的影响。

总的来说,选择使用 Lock 还是 synchronized 取决于具体的需求。在简单的情况下,使用 synchronized 可能更加方便。而在需要更高级特性和更多灵活性的情况下,Lock 接口可能是更好的选择。


原文链接:codingdict.net