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

雷切尔:

我指的是此处提出的问题并使用作者代码示例,现在我的问题是

  1. 作者为什么要使用synchronized(synchronizedMap),真的有必要吗,因为syncedMap始终会确保没有两个线程试图对其进行read/put操作,Map那么为什么我们需要synchronize对该地图本身进行处理呢?

非常感谢您的解释。


  public class MyClass {
  private static Map<String, List<String>> synchronizedMap =
      Collections.synchronizedMap(new HashMap<String, List<String>>());

  public void doWork(String key) {
    List<String> values = null;
    while ((values = synchronizedMap.remove(key)) != null) {
      //do something with values
    }
  }

  public static void addToMap(String key, String value) {
    synchronized (synchronizedMap) {
      if (synchronizedMap.containsKey(key)) {
        synchronizedMap.get(key).add(value);
      }
      else {
        List<String> valuesList = new ArrayList<String>();
        valuesList.add(value);
        synchronizedMap.put(key, valuesList);
      }
    }
  }
}
灰色:

为什么我们需要对其synchronizemap本身进行同步

您可能需要在一个已经同步的集合上进行同步,因为您正在对该集合执行两个操作-在您的示例中,是a containsKey()然后是a put()您试图调用集合的代码中防止竞争情况另外,在这种情况下,该块还保护值,以便多个线程可以将其值添加到这些未同步的集合中。synchronizedArrayList

如果您查看链接到的代码,他们将首先检查键的存在,如果键不存在,则将值放入映射中。您需要防止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而只需HashMapsynchronized块中始终使用一个即可

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

要在哪些对象上进行同步?为什么局部变量不好?

来自分类Java

为什么要在静态锁成员而不是类上进行同步?

来自分类Java

在Integer上进行同步时,为什么notifyAll()引发IllegalMonitorStateException?

来自分类Dev

为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

来自分类Dev

在 Nightwatch 上进行同步循环的更好方法是什么?

来自分类Dev

为什么要使用HttpClient进行同步连接

来自分类Dev

为什么通过HttpWebRequest使用HttpClient进行同步请求

来自分类Dev

是否有必要在列表上进行同步,而仅在进行删除操作时才可以访问该列表

来自分类Dev

为什么要在Javascript / Typescript上进行多种导入/导出

来自分类Dev

如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

来自分类Dev

为什么要在S3上进行主动存储需要使用“ region”字段?

来自分类Dev

ngblur和enter事件:为什么要在Enter键上进行两个HTTP调用?

来自分类Java

在要修改的静态字段上进行同步是否会使代码线程安全?

来自分类Java

Java并发-如何在方法参数上进行同步

来自分类Dev

在类对象上进行同步会阻塞整个类(及其成员)

来自分类Dev

如何在节点服务器上进行同步 http 请求?

来自分类Java

您可以安全地在Java方法参数上进行同步吗?

来自分类Dev

应该在列表本身还是在锁对象上进行同步?

来自分类Dev

使用Node.js和Express for Action在Google上进行同步调用?

来自分类Dev

在centos 7上进行同步确认后的套接字鳍

来自分类Dev

为什么要在小对象上同步?

来自分类Dev

从密钥中删除对象后,是否需要在NSUserDefaults中进行同步?

来自分类Dev

为什么在使用Jenkins x时需要在同一K8实例上进行过渡和生产

来自分类Java

为什么我必须使用同一对象进行同步并调用等待/通知,但是使用类Condition可以使用各种对象?

来自分类Dev

在JavaScript中进行同步API调用

来自分类Dev

Dart 进行同步 api 调用

来自分类Dev

如何进行同步WebScoket连接

来自分类Dev

进行同步和并发模型

来自分类Dev

使用Observables进行同步HTTP请求

Related 相关文章

  1. 1

    要在哪些对象上进行同步?为什么局部变量不好?

  2. 2

    为什么要在静态锁成员而不是类上进行同步?

  3. 3

    在Integer上进行同步时,为什么notifyAll()引发IllegalMonitorStateException?

  4. 4

    为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

  5. 5

    在 Nightwatch 上进行同步循环的更好方法是什么?

  6. 6

    为什么要使用HttpClient进行同步连接

  7. 7

    为什么通过HttpWebRequest使用HttpClient进行同步请求

  8. 8

    是否有必要在列表上进行同步,而仅在进行删除操作时才可以访问该列表

  9. 9

    为什么要在Javascript / Typescript上进行多种导入/导出

  10. 10

    如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

  11. 11

    为什么要在S3上进行主动存储需要使用“ region”字段?

  12. 12

    ngblur和enter事件:为什么要在Enter键上进行两个HTTP调用?

  13. 13

    在要修改的静态字段上进行同步是否会使代码线程安全?

  14. 14

    Java并发-如何在方法参数上进行同步

  15. 15

    在类对象上进行同步会阻塞整个类(及其成员)

  16. 16

    如何在节点服务器上进行同步 http 请求?

  17. 17

    您可以安全地在Java方法参数上进行同步吗?

  18. 18

    应该在列表本身还是在锁对象上进行同步?

  19. 19

    使用Node.js和Express for Action在Google上进行同步调用?

  20. 20

    在centos 7上进行同步确认后的套接字鳍

  21. 21

    为什么要在小对象上同步?

  22. 22

    从密钥中删除对象后,是否需要在NSUserDefaults中进行同步?

  23. 23

    为什么在使用Jenkins x时需要在同一K8实例上进行过渡和生产

  24. 24

    为什么我必须使用同一对象进行同步并调用等待/通知,但是使用类Condition可以使用各种对象?

  25. 25

    在JavaScript中进行同步API调用

  26. 26

    Dart 进行同步 api 调用

  27. 27

    如何进行同步WebScoket连接

  28. 28

    进行同步和并发模型

  29. 29

    使用Observables进行同步HTTP请求

热门标签

归档