Prymon 2015-09-17 03:26 采纳率: 0%
浏览 4151

在多线程情况下,不使用同步,对同一个MAP的并发读写问题

假设有以下场景:

某一个业务要求,定时的从数据库中取出一批数据放入一个hashmap中。

有多个线程对这个MAP进行读操作。

每过一段时间(如3分钟),都会对这个MAP进行修改(put or remove)

该场景对数据的一致性没有非常严格的要求。

如何能够在不使用同步的情况下,对这个MAP进行安全的操作呢?(例如不用concurrentHashMap,或Collections.synchronizedMap)

我的想法是,每次在需要修改MAP的时候,可以创建一个旧MAP的副本,对副本进行修改后,再替换原先的MAP

例如:

Map newMap = oldMap.clone(); //或者用new HashMap().putall(oldMap)来创造副本
newMap.put / remove ..... //修改map
oldMap = newMap; //替换上去

这样就不会因为对同一个map的并发读写而导致快速迭代失败。有没有大神看看这样有什么潜在的问题,比如GC。。请不吝赐教>_<

(
jdk 1.6 api hashMap
在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。
)

  • 写回答

3条回答 默认 最新

  • Evankaka 博客专家认证 2015-09-17 04:54
    关注

    创建一个旧MAP的副本,对副本进行修改后,再替换原先的MAP
    这样做还是可能出现问题的,数据还是有可能出错,同步才是最安全的办法。

    评论

报告相同问题?

悬赏问题

  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元