【发布时间】:2013-09-04 05:16:25
【问题描述】:
我正在尝试使用 ConcurrentHashMap 填充保存键/值的缓存。
我假设使用 CopyOnWriteArrayList 来处理并发性,我将其作为我的键值,但我在下面的代码中遗漏了一些内容,并且在执行多个线程时它会覆盖其值。
if (testMap.get(id) == null) {
CopyOnWriteArrayList<String> copyArr = new CopyOnWriteArrayList<String>();
copyArr.add("Add Value");
testMap().putIfAbsent(id, copyArr);
} else {
testMap.put(id,testMap.get().add("Append Value"));
}
如何保护从多个线程创建CopyOnWriteArrayList 的代码。
这是根据以下建议修改后的代码。
CopyOnWriteArrayList<Subscriber> subscriberArr = CacheUtils.getSubscriberMap().get(syncDet.getCardNumber());
if (subscriberArr == null) {
subscriberArr = new CopyOnWriteArrayList<Subscriber>();
CopyOnWriteArrayList<Subscriber> refArr =
cacheUtils.getSubscriberMap().putIfAbsent(syncDet.getCardNumber(), subscriberArr);
if (refArr != null) {
subscriberArr = refArr;
}
}
subscriberArr.add(syncDet.getSubScriber());
在迭代订阅者映射时,我没有看到值对象。大小为 0。
【问题讨论】:
-
阅读Javadoc 的第一句话 - 这不是一个神奇的替代品,而是有一个陷阱。更重要的是,你为什么不直接写信给你的
ConcurrentHashMap?您编写代码的方式实际上消除了使用putIfAbsent的优势,这与您的if完全相同,但以线程安全的方式。 -
我需要检查该 id 是否已经存在数组列表。如果它存在,我必须为其添加我的价值。
-
那么你需要一个多图吗?好的,那我试着写一个答案。
标签: java concurrency concurrenthashmap copyonwritearraylist