本地散列映射的并发问题

时间:2016-05-02 08:50:04

标签: java concurrency hashmap

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

问题在于,有时mp会填充不同ob个对象的字段。

我认为mp正在遇到并发问题,
同步mp知道它在本地填充并作为参数传递给各种方法以获得填充的最佳方法是什么。

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

1 个答案:

答案 0 :(得分:2)

对于这种情况,你有

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

详情here

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

现在,你必须了解地图大小才能谈论填写它。默认大小为16.但是,有一个0.75的加载因子,这意味着,当map为75%full时,它将调整为之前大小的两倍,这意味着,创建新数组的新Key集,然后将所有内容复制到它(当我说新的Set时,我的意思是调整大小的相同逻辑)。现在,如果你快速填写它,这意味着大量的复制,对于更大的尺寸,它需要时间,所以最好在开始时给它一个大的初始尺寸,如:

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

someLargeSize成为您期望或至少在其附近的顺序,因此您将调整大小减少到最小。不要触摸负载系数,它只会降低性能,75%就可以了。

顺便说一句,Java中HashMap和ConcurrentHashMap(以及HashSet和ArrayList,或任何基于数组的数据结构)的最大大小为1,073,741,824,因为array[]在后​​台,DS在Java中它们大多只是具有特定功能的包装器,但我怀疑你会达到这个限制,因为对于包含一些字符串或其他任何东西的对象,你需要大量的GB RAM。