多线程情况下不使用同步对同一个MAP的并发读写问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2016-03-19 11:45:45 3559 1

假设有以下场景:
某一个业务要求,定时的从数据库中取出一批数据放入一个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。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。
)

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 19:07:55

    尽量用同步,可以避免很多的问题,同步:
    ` synchronizedMap
    public static Map synchronizedMap(Map m)`

    返回由指定映射支持的同步(线程安全的)映射。为了保证按顺序访问,必须通过返回的映射完成 所有对底层实现映射的访问。
    在返回映射的任意 collection 视图上进行迭代时,用户必须手工在返回的映射上进行同步:
     Map m = Collections.synchronizedMap(new HashMap());
              ...
          Set s = m.keySet();  // Needn't be in synchronized block
              ...
          synchronized(m) {  // Synchronizing on m, not s!
              Iterator i = s.iterator(); // Must be in synchronized block
              while (i.hasNext())
                  foo(i.next());
          }
    不遵从此建议将导致无法确定的行为。
    如果指定映射是可序列化的,则返回的映射也将是可序列化的。
    参数:
        m - 被“包装”在同步映射中的映射。 
    返回:
        指定映射的同步视图。 
    0 0
相关问答

1

回答

一个良好的系统架构中的运维流程机制的主要流程有哪些?

2022-05-12 18:45:36 115浏览量 回答数 1

1

回答

有没有检查pg各个内训区域的使用情况的sql?日志记录没有chunk可分配了

2022-04-28 14:05:27 401浏览量 回答数 1

1

回答

java中哪些情况下需要使用匿名内部类?

2022-04-02 19:20:09 345浏览量 回答数 1

1

回答

kubectl中描述为将一个或多个本地端口转发到一个 pod的语法是什么呢?

2022-03-15 22:05:51 369浏览量 回答数 1

1

回答

使用Filebeat采集日志数据,将Kafka作为Filebeat的输出端的操作流程是什么?

2022-01-17 16:55:09 714浏览量 回答数 1

1

回答

原生工程和Flutter关联的差异是什么?

2022-01-07 21:37:19 183浏览量 回答数 1

1

回答

可以在一个容器中同时运行多个应用进程吗?

2021-10-25 22:57:13 582浏览量 回答数 1

0

回答

可以在一个容器中同时运行多个应用进程吗?

2021-10-15 10:47:19 147浏览量 回答数 0

1

回答

怎么使用子账号(全流程指引)

2019-03-13 11:38:14 190浏览量 回答数 1

1

回答

JAVA中多线程使用线程不安全的容器会出现什么情况?

2016-03-12 10:21:40 2220浏览量 回答数 1
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载