【问题标题】:What is the advantage of new Lock interface over synchronized block in Java?新的 Lock 接口相对于 Java 中的同步块有什么优势?
【发布时间】:2011-11-06 08:07:35
【问题描述】:

新的 Lock 接口相对于 Java 中的同步块有什么优势?您需要实现一个高性能缓存,允许多个读取器但单个写入器保持完整性您将如何实现它?

【问题讨论】:

  • Lock 并不是什么新鲜事物,它从 Java5 就已经存在,即从 2004 年开始

标签: java


【解决方案1】:

下面列出了锁接口相对于同步的各种优势

  1. 与没有死锁问题的锁不同,同步是导致死锁问题的唯一罪魁祸首。

  2. 在同步中,我们不知道在前一个线程释放锁之后,一个线程会在多长时间后获得机会。这可能会导致饥饿问题,而在锁的情况下,我们有它的实现类可重入锁,它有一个构造函数,它允许你传递公平属性作为它的参数之一,让最长等待线程有机会获取锁。

  3. 在同步中,如果一个线程正在等待另一个线程,那么等待的线程将不会执行任何其他不需要锁访问但使用锁接口的 trylock() 方法,您可以使用它可以尝试访问锁,如果您没有获得锁,您可以执行其他替代任务。这有助于提高应用程序的性能。

  4. 没有 api 来检查有多少线程正在等待特定的锁,而这可以通过锁接口实现类来实现 ReentrantLock 方法。

  5. 使用lock接口和holdCount()方法可以更好地控制锁,这是同步时找不到的。

【讨论】:

    【解决方案2】:

    锁的优点是

    • 可以让它们变得公平
    • 可以让线程在等待 Lock 对象时响应中断。
    • 可以尝试获取锁,但如果无法获取锁,则立即返回或超时后返回
    • 可以在不同的范围内以不同的顺序获取和释放锁

    请注意,javadoc of Lock 及其子类对此进行了说明。

    可以使用 ConcurrentMap 实现高性能缓存。

    【讨论】:

    • 第二点似乎措辞不当。您可以中断在普通内部 Java 监视器上等待的线程。 LocklockInterruptibly,它允许线程被中断,同时阻止获取锁。
    • @Tom:您当然可以中断等待内部监视器的线程阻塞,但线程不会响应中断。这就是我的意思:将调用中断方法,但线程在获得锁之前无法中断自己,并且它可以永远保持这种状态。我已经更改了措辞,使其更加明确。
    • 关键是目标线程在Thread.State.BLOCKED而不是Thread.State.WAITING(或TIMED_WAITING)。
    【解决方案3】:

    锁接口在多线程和并发编程中的主要优点是它们提供了两个独立的读和写锁,使您能够编写高性能数据结构,如 ConcurrentHashMap 和条件阻塞。

    一个线程只能获得一次锁。同步块不提供任何等待队列的机制,在一个线程退出后,任何线程都可以获取锁。这可能会导致其他线程在很长一段时间内资源匮乏。

    【讨论】:

      【解决方案4】:

      您需要知道何时使用 Lock 以及何时使用同步块/方法。

      • 如果您正在创建简单的应用程序,请使用同步块。它避免了竞争条件。但是在避免竞争条件的同时,您可能会导致死锁。

      • 如果您正在创建严肃的应用程序,请使用锁。它还可以避免竞争条件,但您也可以避免死锁。

      【讨论】:

      • 这真的不是在同步锁和显式锁之间选择的好钥匙。一个严肃的应用程序可能很简单,使用锁显然也会像同步一样导致死锁。
      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多