码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java中线程安全的集合


    使用Collections包装线程不安全的类,使其成为线程安全的类,使用的是sync,效率并无实质提升:

    concurrent包下的线程安全集合:blocking,copyonwrite,concurrent。

     

    coucurrentMap每个方法都是原子的,但是几个方法的组合并不是原子的。concurrentMap是细粒度的锁。普通的HashMap在扩容的时候会有并发死链的问题。

    ConcurrentHashMap的原理:‘

     ConcurrentHashMap在扩容时保证线程安全:

     

    在扩容过程中,处理完毕的链表头节点置为fnode,表明此链表已经处理完毕。其他线程来get,则会到新的线程中去get。

     

    TreeBin是红黑树的头结点,TreeNode是红黑树的树节点。

    整个get流程:

    hash为负数则去新的扩容的HashMap查找元素。

    ConcurrentHashMap不允许有空的键值,put的过程中,只有发生下标冲突,才会使用sync,而且锁的是桶的头节点。

    初始化HashTable,只有一个线程成功,只有一个线程cas成功,然后初始化哈希表:

     addCount:当哈希表put成功后,增加计数。

    put流程,插入新值:

    进入下面的else,说明桶下标冲突了,此时需要对链表头节点加锁,fh >= 0,说明是普通节点,进行普通的插入流程即可,bigcount代表链表长度。

     节点的类型是红黑树:

     

     bigcount(节点数)和门限值比较,看是否需要转化为红黑树:

     

     

     

  • 相关阅读:
    android免root读写u盘最新方法,支持安卓Q+
    2022金九银十仅靠阿里P9分享的 Redis 工作手册,拿到50W年薪Offer
    Python二级 每周练习题19
    xilinx Mailbox 中的ipi message地址计算方式
    【 C++ 】vector的模拟实现
    安装宝塔,使用宝塔自动部署
    flex布局实现 内容区域高度自适应
    内网渗透之Linux反弹shell(综合)
    【前端】前端监控体系
    java泛型详解
  • 原文地址:https://blog.csdn.net/qq_16725749/article/details/126243432
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号