在这种情况下如何避免同步?
How can I avoid Synchronization in this scenario?
我有超过 75 个请求,每个请求都在尝试更新或访问地图。如果我在更新 MAP 时使用 Synchronize 代码块。那么这可能会导致性能问题。
请建议同时更新 75 个以上请求的 MAP 的替代方法。
注意:我正在尝试在Java中实现上述想法。
尝试使用 concurrent hash map。基本上它将你的 hashmap 划分为更小的范围,而不是将锁放在整个地图上,它只会在更小的范围内锁定。
如果你使用带hashmap的synchronized block,它会锁定完整的hashmap,不能同时进行2个写操作。但是,如果您使用并发哈希映射,并且如果您有 2 个写入不同范围的写入操作,则两者可以同时进行。
使用前请参考how concurrent hash map works以加深理解。
编辑:- 请在此处阅读单线程和多线程应用程序中 hashmap 与 concurrenthashmap 的性能提升 Performance ConcurrentHashmap vs HashMap。
有多种解决方法,看看哪种方法最适合您:
同步地图
ConcurrentHashMap
如果您使用 ConcurrentHashMap,这对您来说会更好,因为请求的数量会增加,并且您不会看到任何性能过载。在 ConcurrentHashMap 的情况下,在 ConcurrentHashMap 的特定部分获取锁。这意味着如果两个线程试图分别访问两个不同的部分,他们可以在没有任何等待的情况下这样做。
一次 75 个左右的请求不太可能在不同的 Map
并发访问方式之间造成明显的性能差异。最重要的是代码的简单性和可维护性。 java.util.ConcurrentHashMap
不太可能在您描述的规模上显示其性能优势,但它比其他解决方案更容易使用,您会注意到这一优势。
我将添加一些额外的观点以及 ConcurrentHashMap 的现有答案。如果很多请求是读取类型的,很少请求是更新请求那么你可以看看java.util.concurrent.locks.ReadWriteLock。它允许多个线程一次读取资源,但一次只能有一个线程写入资源。如果更新请求是多个,那么您可以按照先前答案中的建议使用 ConcurrentHashMap
我有超过 75 个请求,每个请求都在尝试更新或访问地图。如果我在更新 MAP 时使用 Synchronize 代码块。那么这可能会导致性能问题。
请建议同时更新 75 个以上请求的 MAP 的替代方法。
注意:我正在尝试在Java中实现上述想法。
尝试使用 concurrent hash map。基本上它将你的 hashmap 划分为更小的范围,而不是将锁放在整个地图上,它只会在更小的范围内锁定。
如果你使用带hashmap的synchronized block,它会锁定完整的hashmap,不能同时进行2个写操作。但是,如果您使用并发哈希映射,并且如果您有 2 个写入不同范围的写入操作,则两者可以同时进行。
使用前请参考how concurrent hash map works以加深理解。
编辑:- 请在此处阅读单线程和多线程应用程序中 hashmap 与 concurrenthashmap 的性能提升 Performance ConcurrentHashmap vs HashMap。
有多种解决方法,看看哪种方法最适合您:
同步地图 ConcurrentHashMap
如果您使用 ConcurrentHashMap,这对您来说会更好,因为请求的数量会增加,并且您不会看到任何性能过载。在 ConcurrentHashMap 的情况下,在 ConcurrentHashMap 的特定部分获取锁。这意味着如果两个线程试图分别访问两个不同的部分,他们可以在没有任何等待的情况下这样做。
一次 75 个左右的请求不太可能在不同的 Map
并发访问方式之间造成明显的性能差异。最重要的是代码的简单性和可维护性。 java.util.ConcurrentHashMap
不太可能在您描述的规模上显示其性能优势,但它比其他解决方案更容易使用,您会注意到这一优势。
我将添加一些额外的观点以及 ConcurrentHashMap 的现有答案。如果很多请求是读取类型的,很少请求是更新请求那么你可以看看java.util.concurrent.locks.ReadWriteLock。它允许多个线程一次读取资源,但一次只能有一个线程写入资源。如果更新请求是多个,那么您可以按照先前答案中的建议使用 ConcurrentHashMap