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