如何在这种情况下避免同步?

时间:2017-04-11 09:56:55

标签: java multithreading collections synchronization deadlock

我有75个以上的请求,每个请求都在尝试更新或访问Map。如果我在更新MAP时使用Synchronize代码块。那么这可能会导致性能问题。

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

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

4 个答案:

答案 0 :(得分:1)

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

如果将synchronized块与hashmap一起使用,它将锁定在完整的hashmap上,并且不能同时进行2次写入操作。但是如果你使用并发哈希映射,如果你有2个不同范围的写操作写入,两者都可以同时进行。

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

修改: - 请在此处Performance ConcurrentHashmap vs HashMap阅读单线程和多线程应用中 hashmap vs concurrenthashmap 的性能增益。

答案 1 :(得分:1)

有多种方法可以解决它,看看最适合你的方法:

SynchronizedMap 的ConcurrentHashMap

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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