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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在这种情况下避免同步?相关的知识,希望对你有一定的参考价值。

我有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

以上是关于如何在这种情况下避免同步?的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下如何避免嵌套 SQL 查询?

在这种情况下如何避免死锁?

仅在按照意图进行时才更改片段(在这种情况下,他们实际上共享应用程序)

避免“资源与文件系统不同步”

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

如何将代码(在这种情况下为类)发送到服务器/程序并接收输出