ConcurrentHashMap操作是线程安全的

时间:2014-02-03 11:06:27

标签: java collections

ConcurrentHashMap的Java Docs说,

  

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

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

修改 我的意思是假设有put()操作。然后根据上面的语句put()在CHM中是线程安全的。这是什么意思?

5 个答案:

答案 0 :(得分:1)

来自维基百科:

  

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

要回答扩展的问题,如果多个线程要执行put(),效果将是最后一个运行将在地图中设置该键的值。所有看跌期权都会以某种顺序发生,但它们不会相互干扰。如果没有并发保证,它们会如何干扰?好吧,如果先前没有任何值与映射或之前的值相关联,put()将返回null。如果在非并发映射上发生了两次放置,则它们都可以从放置中获得相同的返回值。

这个序列可以没有并发:

Thread1: map.put("key1", "value1") => null

然后

Thread2: map.put("key2", "value2") => "value1"
Thread3: map.put("key3", "value3") => "value1"

如果Thread3在Thread2之后进入,它可能会看到“value1”而不是“value2”,即使它不是它所取代的。这不会发生在并发映射中。

答案 1 :(得分:1)

线程安全意味着您可以跨多个线程共享ConcurrentHashMap对象,并且无需外部锁定即可同时访问/修改该对象。

答案 2 :(得分:1)

线程安全意味着在仍然正常运行的情况下,多个线程可以同时使用对象。在ConcurrentHashMap的特定情况下,这些特征得到保证:

  • 地图生成的迭代器永远不会抛出ConcurrentModificationException,并且它们将按照创建时修复的顺序进行迭代。它们可能会也可能不会反映在访问地图时所做的任何修改。普通的HashMap迭代器会在线程迭代时修改异常。
  • 插入和删除操作是线程安全的。如果多个线程试图同时插入或删除项目,普通HashMap可能会进入不一致的内部状态,尤其是如果修改需要重新进行更新。

答案 3 :(得分:0)

如果两个线程同时尝试对ConcurrentHashMap执行操作,则可以保证操作不会使数据结构处于不一致状态。 这不是其他非并发数据结构保证的东西。

答案 4 :(得分:0)

这意味着您在哈希映射中添加/删除对象所做的所有操作都是线程安全的,但检索不是线程安全的。意味着当您在完美的线程安全环境中添加对象时,在该时刻之后该对象应该对从该MAP检索对象的所有线程可见。但这件事并不能保证。