java:通过多个线程向映射添加值(可能吗?)

java:通过多个线程向映射添加值(可能吗?),java,multithreading,synchronization,Java,Multithreading,Synchronization,由多个线程同时向映射添加元素是否线程安全 比如,如果10个线程同时向一个映射添加一个元素,那么该映射将包含10个元素还是1个元素 更新:我不需要遍历这个映射,我只需要按键添加、删除和获取元素检查是否适合您的情况。检查是否适合您的情况。有几种方法可以处理这个问题: 使用一个。一般不建议这样做。Hashtable早于Java1.2的Java集合框架,但它是put()和get()方法是同步的 将您的地图包装到(这是(1)的更好版本) 使用;或 实施您自己的同步方案(不推荐) 有几种方法可以处理此问题:

由多个线程同时向映射添加元素是否线程安全
比如,如果10个线程同时向一个映射添加一个元素,那么该映射将包含10个元素还是1个元素


更新:我不需要遍历这个映射,我只需要按键添加、删除和获取元素

检查是否适合您的情况。

检查是否适合您的情况。

有几种方法可以处理这个问题:

  • 使用一个。一般不建议这样做。Hashtable早于Java1.2的Java集合框架,但它是
    put()
    get()
    方法是
    同步的
  • 将您的
    地图
    包装到(这是(1)的更好版本)
  • 使用;或
  • 实施您自己的同步方案(不推荐)

  • 有几种方法可以处理此问题:

  • 使用一个。一般不建议这样做。Hashtable早于Java1.2的Java集合框架,但它是
    put()
    get()
    方法是
    同步的
  • 将您的
    地图
    包装到(这是(1)的更好版本)
  • 使用;或
  • 实施您自己的同步方案(不推荐)

  • 您的问题毫无意义,因为
    Map
    是一种接口类型,而线程安全性是一种实现属性

    也就是说,最常用的
    Map
    实现,特别是
    HashMap
    不是线程安全的。添加来自不同线程的元素可能会使映射处于不一致的状态,例如,插入的元素无法检索,尽管
    size()
    显示它们存在

    您可以使用
    Collections.synchronizedMap()
    来创建同步包装,或者使用旧的
    Hashtable
    类(不推荐),该类也是同步的。但是请注意,对于单个操作来说,这些操作仍然是线程安全的——相互依赖的操作序列,如通过映射的迭代,仍然需要额外的手动同步


    ConcurrentHashMap
    是一个非常有趣的实现,它允许某些类型的多线程访问,而不使用同步,当有许多线程并行访问它时,会产生非常好的性能。但它并不适用于所有用例。

    您的问题毫无意义,因为
    Map
    是一种接口类型,线程安全性是一种实现属性

    也就是说,最常用的
    Map
    实现,特别是
    HashMap
    不是线程安全的。添加来自不同线程的元素可能会使映射处于不一致的状态,例如,插入的元素无法检索,尽管
    size()
    显示它们存在

    您可以使用
    Collections.synchronizedMap()
    来创建同步包装,或者使用旧的
    Hashtable
    类(不推荐),该类也是同步的。但是请注意,对于单个操作来说,这些操作仍然是线程安全的——相互依赖的操作序列,如通过映射的迭代,仍然需要额外的手动同步


    ConcurrentHashMap
    是一个非常有趣的实现,它允许某些类型的多线程访问,而不使用同步,当有许多线程并行访问它时,会产生非常好的性能。但它并不适用于所有的用例。

    我认为它适合,我只是觉得这对我来说可能太多了,比如说如果我的场景可以快速工作的话ConcurrenthAshmap绝对是多线程场景的最快解决方案。我认为它适合,我只是觉得这对我来说可能太多了,就我的场景而言,如果有什么东西可以快速工作ConcurrenthashMap绝对是多线程场景中最快的解决方案。根据我自己的经验:哈希映射不是线程安全的-找到死锁的原因是一场噩梦。。。(是的,这是hashmap上的并发添加操作)根据我自己的经验:hashmap不是线程安全的——找到死锁的原因是一场噩梦。。。(是的,对于一些我没有想到的选项,它是hashmap上的并发add操作)+1。考虑清楚哪些才是最好的方法?你应该阅读它到底有多坏。我没有想到的一些选择。考虑清楚哪些是最好的方式?你应该阅读看看它到底有多坏。