java吧 关注:1,232,798贴子:12,700,038
  • 5回复贴,共1

问一个多线程情况下,不使用同步的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。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。
)


IP属地:湖北1楼2015-09-17 10:45回复
    本人自学java一个月,认为不会


    IP属地:河北来自手机贴吧2楼2015-09-17 10:57
    收起回复
      太长慢慢儿看


      IP属地:湖北3楼2015-09-17 11:11
      回复
        操作的时候对map加锁,调用也不是很频繁 完全够了


        来自Android客户端4楼2015-09-17 11:12
        回复
          说不用concurrentHashMap,最终还只是实现了concurrentHashMap的功能,看源码吧


          IP属地:福建5楼2015-09-17 11:43
          回复