栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么要在SynchronizedMap或SynchronizedCollections上进行同步?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么要在SynchronizedMap或SynchronizedCollections上进行同步?

为什么我们需要对其

synchronizemap
本身进行同步?

您可能需要在一个已经同步的集合上进行同步,因为您正在对该集合执行两个操作-在您的示例中,是a

containsKey()
然后是a
put()
。您试图在 _调用_集合的代码中防止竞争情况。另外,在这种情况下,该块还保护值,以便多个线程可以将其值添加到这些未同步的集合中。
__
synchronized``ArrayList

如果您查看链接到的代码,他们将首先检查键的存在,如果键不存在,则将值放入映射中。您需要防止2个线程的一个重要的生存确认,然后 两个
人投入的地图。比赛是哪一个将第一名,哪个人将覆盖前一名。

同步的集合可保护自己免受多个线程破坏映射本身的侵害。它 不能 防止围绕多次调用该映射的逻辑竞争条件。

synchronized (synchronizedMap) {    // test for a key in the map    if (synchronizedMap.containsKey(key)) {      synchronizedMap.get(key).add(value);    } else {      List<String> valuesList = new ArrayList<String>();      valuesList.add(value);      // store a value into the map      synchronizedMap.put(key, valuesList);   }}

这是

ConcurrentMap
接口具有的原因之一
putIfAbsent(K key, V value);
。但这 并不
需要两个操作,所以你可能并不需要围绕它同步。

顺便说一句,我将上面的代码重写为:

synchronized (synchronizedMap) {    // test for a key in the map    List<String> valuesList = synchronizedMap.get(key);    if (valueList == null) {      valuesList = new ArrayList<String>();      // store a value into the map      synchronizedMap.put(key, valuesList);    }    valuesList.add(value);}

最后,如果地图上的大多数操作

synchronized
无论如何都需要位于一个块中,那么您不妨为支付费用,
synchronizedMap
而只需
HashMap
synchronized
块中始终使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431400.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号