java - 出于可扩展性目的,不使用 ConcurrentHashMap 并发访问 Java Map

标签 java multithreading concurrency scalability atomic

我有一个提供程序类,它将我的对象与字符串相关联;简而言之,我的提供程序包装了 a (比方说 Map<String, Object> )并具有以下 3 个操作:

  • Object get(String key) :由多个线程大规模运行
  • void add(String key, Object obj) :由单线程运行
  • void remove(String key) :由与 add 相同的单线程运行

get()操作需要快速且可扩展,add()remove()操作对性能要求不强

我想避免使用 ConcurrentHashMap因为它肯定会导致可扩展性问题

所以我的想法是包装一个HashMap并执行以下操作:

  • 我的get()操作执行 HashMap.get()
  • 我的add()手术
    • 复制原件HashMap
    • 将新元素添加到复制的 HashMap
    • 做以下做作originalHashMap = copiedHashMap
  • 我的remove()操作(几乎相同)
    • 复制原件HashMap
    • 从复制的 HashMap 中删除所需的元素
    • 做以下做作originalHashMap = copiedHashMap

在我看来,这种做法是完全可扩展的。你觉得怎么样?

我认为为了我的发展,我需要包装我的 Map AtomicReference<> 中的属性: 你对此有何看法?

感谢您的帮助

最佳答案

我在这里很困惑。您说您想避免可扩展性问题,您的解决方案是在每个写入命令上复制整个 map ?

您可能知道也可能不知道这一点,但这本质上就是 ConcurrentHashMap 在幕后所做的事情。只是它以这样的方式执行此操作:仅对正在写入的映射的一小部分执行此操作,并且仅在绝对必要时才执行复制。它是由业内一些最聪明的人编写的,并且已经在实验室和野外进行了广泛的测试。

因此,为什么不直接使用 ConcurrentHashMap 呢?

说真的,这是一个已解决的问题, friend 。

关于java - 出于可扩展性目的,不使用 ConcurrentHashMap 并发访问 Java Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196053/

相关文章:

主线程中的Python未捕获异常不会杀死线程

c - 如果线程在其他线程等待(加入)之前退出怎么办?

java - 线程同步和 volatile 关键字

swift - 调度队列异步调用

java - 原子变量是否保证内存可见性?

java - 如何从 POST 请求中检索 cookie?

java - 由于内部联接而不是左联接,Spring DTO 投影查询不会返回所有结果

java - 从数据库中读取数据并存储在 Array List 对象中

Java正则表达式匹配相同特定字符序列之间的所有内容

java - 产生线程时,如何限制可能的最大数量?