代码之家  ›  专栏  ›  技术社区  ›  GingerHead

本地哈希映射的并发问题

  •  -1
  • GingerHead  · 技术社区  · 10 年前

    我有一个方法可以接收 Object ob 作为参数。
    此方法具有本地 HashMap<String, String> mp 其中填充了以下字段 ob ,它还调用其他方法传递 对象 mp 作为参数。

    问题是有时 mp(百万英镑) 用不同的字段填充 对象 物体。

    我想 mp(百万英镑) 遇到并发问题,
    同步的最佳方式是什么 mp(百万英镑) 知道它是本地填充的,并作为参数传递给各种方法来填充。

    我没有线程或控制线程,应用程序部署在weblogic服务器中,所以它通过webservices调用,所以很多调用

    1 回复  |  直到 10 年前
        1
  •  2
  •   Adnan Isajbegovic    10 年前

    对于这种情况,您有

    java.util.concurrent.ConcurrentHashMap<K,V>
    

    细节 here .

    简而言之,ConcurrentHashMap的工作原理是拥有独立锁定的独立块,因此在工作完成之前,没有其他线程可以访问它(但此时可以访问其他块)。默认块大小为16。更多信息 here .

    现在,您必须了解地图大小,才能讨论如何填充地图。默认大小为16。但是,有一个0.75的负载系数,这意味着当地图占满75%时,它将调整大小为以前大小的两倍,也就是说,创建新的数组新的键集,然后将所有内容复制到它(当我说new Set时,我指的是在其中调整大小的相同逻辑)。现在,如果您快速填充,这意味着需要大量复制,对于较大的尺寸,需要花费时间,因此最好在开始时设置较大的初始尺寸,例如:

    ConcurrentHashMap<String, Object> mp = new ConcurrentHashMapy<>(someLargeSize);
    

    允许 someLargeSize 按照你期望的顺序,或者至少在它附近,所以你把大小调整减到最小。不要触摸负载系数,它只会降低性能,75%是可以的。

    顺便提一下,Java中HashMap和ConcurrentHashMap(以及HashSet和ArrayList,或任何基于数组的数据结构)的最大大小为 1,073,741,824 ,自 array[] 在后台,Java中的DS大多只是具有特定函数的包装器,但我怀疑您是否会达到这个限制,因为对于包含一些字符串或其他任何内容的对象,您需要大量GB的RAM来实现它。