当前位置: 首页 > 面试题库 >

需要简单的解释“锁条”如何与ConcurrentHashMap一起使用

汪明德
2023-03-14
问题内容

根据Java Concurrency in Practice,第11.4.3章说:

锁拆分有时可以扩展为对一组可变对象的独立对象进行分区锁,在这种情况下,这称为锁拆分。例如,ConcurrentHashMap的实现使用了一个由16个锁组成的数组,每个锁保护着1/16的哈希桶。桶N由锁N
mod 16保护。

我仍然无法理解和可视化锁条和桶机制。有人可以用很好的理解力来解释这个问题吗:)

提前致谢。


问题答案:

哈希图建立在数组上,哈希函数将对象映射到基础数组中的元素。假设基础数组包含1024个元素-
ConcurrentHashMap实际上将其变成16个不同的子数组,包含64个元素,例如{0,63},{64,127}等。每个子数组都有自己的锁,因此修改{0,63}子数组不会影响{64,127}子数组-
一个线程可以写入第一个子数组,而另一个线程写入第二个子数组。



 类似资料:
  • 根据实践中的Java并发,11.4.3章说: 锁拆分有时可以扩展到对一组可变的独立对象进行分区锁定,在这种情况下称为锁条带化。例如,ConcurrentHashMap的实现使用了一个由16个锁组成的数组,每个锁守护1/16的散列桶;铲斗N由锁N mod 16保护。

  • 问题内容: 我通过“ SHOW INNODB STATUS”收到了以下死锁日志。有人可以解释一下为什么交易被中止吗?似乎事务2持有该锁,但也卡住以请求相同的锁(“等待”部分除外),当事务1也需要它时,这将导致死锁。 问题答案: 第一步是确定两个查询是什么: SELECT API_KEY,完成,创建,删除,标记,,GROUP_ID,主机名,,JID,标签,语言,优先,,重新启动,状态,类型,UID,

  • 问题内容: 我有一个ConcurrentHashMap,在其中执行以下操作: 我的问题是-是否有必要做多余的事情 检查同步块内部,以便其他线程不会初始化相同的哈希图值? 也许检查是必要的,但我做错了吗?我在做什么似乎有点可笑,但我认为这是必要的。 问题答案: *ConcurrentHashMap上的 *所有 操作都是线程安全的,但是线程安全的操作是不可组合的。您试图使原子操作成为一对操作:检查地图

  • 可能的重复: Java是什么?:运算符叫什么,它做什么? 你好,我在理解下面的代码时遇到了一些问题,有人能帮我弄到吗? 我不明白是什么意思。

  • 我正在尝试将xml解析为java对象,我已经阅读并实现了以下教程: http://www.vogella.com/articles/JAXB/article.html(效果很好) 但是当我创建自己的类时(类似于教程中的类) 我得到:异常在线程"main"com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExcema: 1计数的Illega

  • 问题内容: 我知道这个问题在这里已经问过 几次了。但这些看起来相当过时了,它看起来像阿贾克斯的Adsense项目已罐装的(或至少是,移动很慢)。 我有一个最近整合了pjax的网站-基本上,它使用Ajax来加载主要内容区域,同时使用javascript来保持浏览器历史记录和后退/前进功能。整个站点的响应速度,因为它不再需要对站点的所有外壳(javascript,css,图像)进行HTTP请求。 但是