首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentHashMap操作是线程安全的。

ConcurrentHashMap操作是线程安全的。
EN

Stack Overflow用户
提问于 2014-02-03 11:06:26
回答 5查看 1.4K关注 0票数 0

ConcurrentHashMap的Java说,

即使所有操作都是线程安全的。

当我们说ConcurrentHashMap的所有操作都是线程安全的时候,意味着什么?

编辑:,我想问的是,假设有put()操作。然后,根据上面的声明,CHM中的put()是线程安全的。这是什么意思?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-03 11:08:48

维基百科:

一段代码是线程安全的,如果它只以保证同时由多个线程安全执行的方式操作共享数据结构。

要回答扩展的问题,如果多个线程要执行put(),那么最后一个要运行的线程将设置映射中该键的值。所有的投手都会按一定的顺序进行,但不会互相干扰。在没有并发保证的情况下,他们怎么可能干涉呢?如果以前没有与映射或前一个值相关联的值,put()返回null。如果两个put发生在一个非并发映射上,那么它们都可以从put中获得相同的返回值。

如果没有并发性,这个序列是可能的:

代码语言:javascript
复制
Thread1: map.put("key1", "value1") => null

然后

代码语言:javascript
复制
Thread2: map.put("key2", "value2") => "value1"
Thread3: map.put("key3", "value3") => "value1"

如果Thread3只是在Thread2之后进入,它可能会看到"value1“而不是"value2",尽管这不是它所取代的。这种情况不会发生在并行地图上。

票数 1
EN

Stack Overflow用户

发布于 2014-02-03 11:12:44

线程安全意味着您可以在多个线程之间共享一个ConcurrentHashMap对象,并且可以在没有外部锁定的情况下并发地访问/修改该对象。

票数 1
EN

Stack Overflow用户

发布于 2014-02-03 11:47:59

线程安全意味着一个对象可以同时被多个线程使用,同时仍能正确地操作。在ConcurrentHashMap的具体情况下,这些特性得到了保证:

  • 由映射生成的迭代器永远不会抛出ConcurrentModificationException,它们将按照创建时固定的顺序迭代。它们可能反映或不反映在访问地图时所做的任何修改。普通的HashMap迭代器在线程迭代时会抛出异常。
  • 插入和删除操作是线程安全的.如果多个线程试图同时插入或删除项,特别是当修改需要重散列时,普通的HashMap可能会进入不一致的内部状态。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21525697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档