ConcurrentHashMap读写锁

Lea*_*ner 16 java multithreading thread-safety concurrenthashmap

我试图找到这些答案,但无法在Google或Java文档中找到它.

情况1:ConcurrentHashMap,假设线程t1正在从段n读取,并且在同一个另一个线程t2想要在同一段n上写入:

问题1:这两个操作将是一个接一个,还是会同时执行?


情况2:ConcurrentHashMap,假设线程t1正在写入段n,并且在同一个另一个线程t2想要从同一段n读取,

问题2:这两个操作将是一个接一个,还是会同时执行?

kan*_*kan 21

我想javadoc会回答你的两个问题:

检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠.检索反映了最近完成的更新操作的结果.对于诸如putAll和clear之类的聚合操作,并发检索可能反映仅插入或删除某些条目.

细分用于更新操作:

更新操作之间允许的并发性由可选的concurrencyLevel构造函数参数(缺省值16)引导,该参数用作内部大小调整的提示.

因此,简而言之,读取不会被阻止(它被实现为读取volatile变量).如果写入在同一段中,则写入可能会相互阻塞.

  • 简而言之,如果一个段被更新并且其他一些线程想要读取它,它将能够读取,但是将获得最后更新的值(不是当前/正在进行的值),对吧? (3认同)
  • @Naroji据我了解,读取操作读取最近完成的更新的结果。它是使用'volatile'变量实现的,因此遵循* http://en.wikipedia.org/wiki/Happened-before*语义。 (2认同)