ConcurrentHashmap同时执行write和get操作

时间:2016-10-24 07:34:17

标签: java concurrency concurrenthashmap

我对ConcurrentHashMaps有疑问。可以说我有2个线程。 线程A尝试从共享的ConcurrentHashMap获取对象。 线程B清除共享映射。 如果线程A和线程B同时访问共享资源会发生什么。我搜索了文档和网页,无法找到明确的答案,也尝试自己做,但无济于事。

3 个答案:

答案 0 :(得分:7)

ConcurrentHashMap基于并发级别划分为不同的。因此,不同的线程可以在java中同时访问不同的段。

  

线程可以读取其他一些锁定的ConcurrentHashMap段   java中的线程?

是。当线程锁定一个段进行更新时,它不会阻止它进行检索(由get方法完成),因此其他一些线程可以读取段(通过get方法),但是它可以在锁定之前读取数据。

对于 putAll 等操作,并发检索可能反映仅删除某些条目。 对于清除等操作,并发检索可能反映仅删除某些条目。

答案 1 :(得分:2)

两个线程不能同时改变。使用这些数据结构的重点是,他们阻止多个线程更新核心内部数据"在同一时间。

有两个线程在同一时间点更改地图可能。因为ConcurrentHashMap中的代码不会允许两个线程并行操作

:当一个主题读取时,另一个更新该数据;事情是不同的!由于阅读部分可以"输入"临界区,即使它当前由另一个线程拥有。

答案 2 :(得分:1)

文档对此案非常清楚:

  

检索操作(包括get)一般不会阻塞,所以可能   与更新操作重叠(包括放置和删除)。

因此,如果两个线程同时使用该资源但是一个正在读取而另一个正在更新,则可以读取不可用的资源。
有关详细信息,请查看documentation paragraph 2