与Java中的同步块相比,新的锁接口有什么优势?

与Java中的同步块相比,新的锁接口有什么优势?,java,Java,与Java中的同步块相比,新的锁接口有什么优势?您需要实现一个高性能缓存,它允许多个读卡器而不是单个写入器保持完整性。您将如何实现它?锁的优点是 有可能使他们公平 在等待锁对象时,可以使线程对中断作出响应 可以尝试获取锁,但如果无法获取锁,则会立即返回或在超时后返回 可以在不同的范围内以不同的顺序获取和释放锁 请注意,在及其子类中对此进行了解释 可以使用ConcurrentMap实现高性能缓存。您需要知道何时使用锁,何时使用同步块/方法 如果要创建简单的应用程序,请使用同步块。它避免了比赛

与Java中的同步块相比,新的锁接口有什么优势?您需要实现一个高性能缓存,它允许多个读卡器而不是单个写入器保持完整性。您将如何实现它?

锁的优点是

  • 有可能使他们公平
  • 在等待锁对象时,可以使线程对中断作出响应
  • 可以尝试获取锁,但如果无法获取锁,则会立即返回或在超时后返回
  • 可以在不同的范围内以不同的顺序获取和释放锁
请注意,在及其子类中对此进行了解释


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

您需要知道何时使用锁,何时使用同步块/方法

  • 如果要创建简单的应用程序,请使用同步块。它避免了比赛条件。但在避免比赛条件的同时,你可能会造成僵局

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


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

  • 同步是导致死锁问题的唯一罪魁祸首,而锁不存在死锁问题

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

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

  • 没有api来检查有多少线程在等待一个特定的锁,而这在锁接口实现类中是可能的 可重入锁定方法

  • 使用带有holdCount()方法的锁接口可以更好地控制锁,而同步中找不到这种方法


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


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

    这确实不是在同步锁和显式锁之间进行选择的好方法。一个严肃的应用程序可能很简单,使用锁显然也会像synchronized一样导致死锁。您可以中断一个线程等待一个普通的内在Java监视器
    Lock
    具有
    lockInterruptibly
    功能,该功能允许线程在被阻止获取锁时被中断。@Tom:当然,您可以中断被阻止的线程等待内部监视器,但线程不会对中断作出响应。这就是我的意思:中断方法将被调用,但线程在获得锁之前无法中断自身,并且它可能永远处于这种状态。我改变了措辞,使其更加明确。关键点是目标线程处于
    thread.State.BLOCKED
    而不是
    thread.State.WAITING
    (或
    TIMED\u WAITING
    )。
    Lock
    并不是什么新鲜事,它从Java5开始就存在了,也就是从2004年开始