【问题标题】:How can I avoid Synchronization in this scenario?在这种情况下如何避免同步?
【发布时间】:2017-04-11 09:56:54
【问题描述】:

我有超过 75 个请求,每个请求都在尝试更新或访问地图。如果我在更新 MAP 时使用同步代码块。那么这可能会导致性能问题。

请建议同时更新 MAP 的替代方法,超过 75 个请求。

注意:我正在尝试在 Java 中实现上述想法。

【问题讨论】:

  • 如果你想要一个线程安全的映射,你会遇到性能问题,因为它不能同时被多次访问。

标签: java multithreading collections synchronization deadlock


【解决方案1】:

有多种解决方法,看看哪种最适合你:

同步地图 并发哈希映射

如果您使用 ConcurrentHashMap 对您来说会更好,因为请求的数量可以增加并且您不会看到任何性能过载。如果在 ConcurrentHashMap 的特定部分获取 ConcurrentHashMap 锁。这意味着如果两个线程试图分别访问两个不同的部分,他们可以这样做而无需任何等待。

【讨论】:

    【解决方案2】:

    一次 75 个左右的请求不太可能导致同时访问 Map 的不同方式之间出现任何明显的性能差异。最重要的是代码的简单性和可维护性。 java.util.ConcurrentHashMap 不太可能以您所描述的规模显示其性能优势,但它比其他解决方案更容易使用,您会注意到这一优势。

    【讨论】:

      【解决方案3】:

      尝试使用concurrent hash map。基本上,它将您的哈希图划分为更小的范围,而不是将锁放在整个地图上,它只会在更小的范围内锁定。

      如果你使用带 hashmap 的同步块,它会将锁放在完整的 hashmap 上,并且不能同时进行 2 个写操作。但是,如果您使用并发哈希映射并且如果您有 2 个写入操作在不同范围内写入,则两者可以同时进行。

      使用前请参考how concurrent hash map works,以便更好地理解。

      编辑:- 请在此处阅读 hashmap vs concurrenthashmap 在单线程和多线程应用程序中的性能提升Performance ConcurrentHashmap vs HashMap

      【讨论】:

        【解决方案4】:

        我将添加一些额外的视角以及 ConcurrentHashMap 的现有答案。如果许多请求是读取类型,而很少请求是更新请求,那么您可以查看 java.util.concurrent.locks.ReadWriteLock。它允许多个线程一次读取一个资源,但只有一个线程可以写入它。如果更新请求是多个,那么您可以按照先前答案中的建议使用 ConcurrentHashMap

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-22
          • 2015-04-14
          • 1970-01-01
          • 1970-01-01
          • 2020-07-21
          • 1970-01-01
          • 2013-07-17
          相关资源
          最近更新 更多