当前位置: 首页 > 后端技术 > Java

为什么不锁定ConcurrentHashMap

时间:2023-04-01 21:02:26 Java

读?总数?写锁?扩张过程?https://blog.csdn.net/hao4954...https://blog.csdn.net/lxsxkf/...如果链表超过8个,则转换成红黑树扩展因子0.75segmentcounting,使用一个cellarray和一个base,put/remove数据时,冲突不严重时,base由cas操作,失败则随机选择一个cell操作count,cell数组会扩容如果失败。计数时,将所有单元格加起来。readwithoutlock:1:当bucket为list时,采用尾插入方式,所以可以遍历新插入的节点。2:在扩容过程中,如果节点没有被迁移过或者没有被迁移过,那么搜索节点会在之前的bucket中搜索。如果节点迁移完成,会被标记为fwd节点,fwd节点包含一个新的nextTable。确保在整个地图迁移过程中,有足够的读取。3:如果是插入到树中,需要调整树。红黑树中有读写锁,调整树需要获取写锁。如果read获取锁失败,会循环遍历链表寻找节点。如果在循环中对树进行了调整,那么会和红黑树一样进行查找。putdata:会在对应的bucket上加一个synclock。如果节点为pwd,则表示地图正在扩容,将协助扩容。如果是插入红黑树,还需要为读写锁加写锁。如果写锁失败,就会阻塞,等待读锁被释放。