集合之CurrentHashMap 1.7总结

文章目录

    • 底层实现
    • 构造方法默认的三个参数
    • 什么是Unsafe类?它有什么作用?
    • 为什么CurrentHashMap 调用Unsafe方法不会报错?我们自己创建的对象调用会报错?
    • CurrentHashMap的key,value可以为null吗?
    • CurrentHashMap如何计算size?
    • 总结流程图
      • PUT:
      • GET:

底层实现

  • 数组+链表+Segment分段锁

构造方法默认的三个参数

  • DEFAULT_INITIAL_CAPACITY=16; //默认的初始化容量,表示每个segment下的每个默认数组大小

  • DEFAULT_LOAD_FACTOR= 0.75f; // 负载因子

  • DEFAULT_CONCURRENCY_LEVEL=16; //并发级别,默认16,表示segment数组大小。

  • 构造方法总结:ConcurrentHashMap中保存了一个默认长度为16的Segment[]数组,每个Segment数组中保存了一个默认长度为2的HashEntry[]数组,我们添加元素,是存入对应的Segment数组中的HashEntry[]数组中。

什么是Unsafe类?它有什么作用?

  • Unsafe类是在sun.misc包下,不属于Java标准。很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。
  • 使用Unsafe可用来直接访问系统内存资源并进行自主管理,Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。
  • Unsafe提供了一些低层次操作,如直接内存访问、线程调度等。
  • 官方并不建议使用Unsafe。

为什么CurrentHashMap 调用Unsafe方法不会报错?我们自己创建的对象调用会报错?

  • 因为我们自己创建的对象使用的类加载器是ApplicationClassLoader,当调用class.getClassLoader()方法后返回不为null,所以会直接抛出异常,而CurrentHashMap使用的类加载器是BootstrapClassLoader,调用class.getClassLoader()后返回为null,所以会直接返回对象。

  • 具体源码如下:

private Unsafe() {
}
public static Unsafe getUnsafe() {
    Class var0 = Reflection.getCallerClass(2);
    if (var0.getClassLoader() != null) {
        throw new SecurityException("Unsafe");
    } else {
        return theUnsafe;
    }
}

CurrentHashMap的key,value可以为null吗?

  • 都不可以,会报错。

CurrentHashMap如何计算size?

  • 遍历每个segment,先得到总数,然后得到修改的次数,然后修改次数和上一次修改次数对比,如果有变化,则代表被修改了,则重新进行遍历,并且次数+1。如果遍历次数超过阈值,则对每一个segment上锁,然后遍历。

总结流程图

PUT:

请添加图片描述

GET:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/3619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

水风险指数定义及计算:水资源压力等

水风险指数(Water risk indicators) 水风险指数(Water risk indicators)是用来评估水资源可持续性和水相关风险的一种工具,可以通过多种指标来衡量。 1.1 水资源压力(water stress, WS) 定义…

leetcode -- 142. 环形链表 II

🐨目录📜1. 题目🔍2. 思路🔑2.1 链表是否带环🔑2.2 为何能追上🔑2.3 入口点的确定🔓3. 代码实现📡4. 题目链接📜1. 题目 给定一个链表的头节点 head,返回链表…

自定义类型 (位段、枚举、联合体)

文章目录📬位段🔎1.什么是位段🔎2.位段的内存分配🔎3.位段的跨平台问题📬枚举🔎1.枚举类型的定义🔎2.枚举的优点🔎3.枚举的使用📬联合(共用体)&am…

C/C++中for语句循环用法及练习

目录 语法 下面是 for 循环的控制流: 实例 基于范围的for循环(C11) 随堂笔记! C语言训练-计算1~N之间所有奇数之和 题目描述 输入格式 输出格式 样例输入 样例输出 环形方阵 干货直达 for 循环允许您编写一个执行特定次数的循环的重复控制结构。…

Go语言基础:数组定义及循环遍历

前言 大家好,我是沐风晓月,本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言,持续更新中,欢迎点赞收藏。 🏠个人主页:我是沐风晓月 🧑个人…

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方: URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…

RedgateClone启用并行工作流 crack

RedgateClone启用并行工作流 crack RedgateClone允许您轻松创建用于开发和测试场景的数据库的一次性副本。通过使用生产数据库的克隆来降低成本并提高测试和发布的质量。Redgate克隆支持Microsoft SQL Server、Postgres、Oracle和MySQL数据库。 红门克隆的好处 最多可节省99%的…

CentOS从gcc 4.8.5 升级到gcc 8.3.1

gcc -v查看当前gcc版本。 sudo yum install centos-release-scl-rh安装centos-release-scl-rh。 sudo yum install devtoolset-8-build安装devtoolset-8-build。 显示“Complete!”表示安装成功。 sudo yum install devtoolset-8-gdb安装devtoolset-8-gdb。 显示“Comple…

[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]

目录 1.想法 2.框架的搭构 2.1图书 2.1.1Book类 2.1.2BookList类 2.2用户 2.2.1User抽象类 2.2.2AdminUser类(管理者) 2.2.3NormalUser 2.3操作 操作接口 借阅操作 删除操作 查询操作 归还图书 展示图书 退出系统 2.4小结 3.主函数的编…

【python实操】年轻人,别用记事本保存数据了,试试数据库吧

为什么用数据库? 数据库比记事本强在哪? 答案很明显,你的文件很多时候都只能被一个人打开,不能被重复打开。当有几百万数据的时候,你如何去查询操作数据,速度上要快,看起来要清晰直接 数据库比我…

Azure OpenAI 官方指南03|DALL-E 的图像生成功能与安全过滤机制

2021年1月,OpenAI 推出 DALL-E。这是 GPT 模型在图像生成方面的人工智能应用。其名称来源于著名画家、艺术家萨尔瓦多 • 达利(Dal)和机器人总动员(Wall-E)。DALL-E 图像生成器,能够直接根据文本描述生成多…

蓝桥杯真题——模拟灌溉系统

尽量每天都自己写一遍模板,记住模板就好写了 以下内容直接在模板内进行 基本任务:要求“模拟智能灌溉系统”能够实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设 定及存储等基本功能。通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号…

常见排序算法(C语言实现)

文章目录排序介绍插入排序直接插入排序希尔排序选择排序选择排序堆排序交换排序冒泡排序快速排序递归实现Hoare版本挖坑法前后指针版本非递归实现Hoare版本挖坑法前后指针版本快排的优化三值取中小区间优化归并排序递归实现非递归实现计数排序排序算法复杂度及稳定性分析不同算…

C语言——字符串函数(2)和内存函数

(一)strtok函数dilimiters参数是个字符串,定义了用作分隔符的字符集合第一个参数指定一个字符串,它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回…

第二章Vue组件化编程

文章目录模块与组件、模块化与组件化模块组件模块化组件化Vue中的组件含义非单文件组件基本使用组件注意事项使用 kebab-case使用 PascalCase组件的嵌套模板templateVueComponent一个重要的内置功能单文件组件Vue脚手架使用Vue CLI脚手架先配置环境初始化脚手架分析脚手架结构实…

vue路由的使用

地址&#xff1a; 入门 | Vue Router 一、导入vuerouter依赖包 注意&#xff0c;一定要先引入vue&#xff0c;再引入vue-router&#xff08;引入vue在引入vue-router的上面&#xff09;。不然会报错 <head><meta charset"utf-8"><title></ti…

算法:贪婪算法、分而治之

算法&#xff1a;贪婪算法、分而治之 文章目录1.贪婪算法计数硬币实例12.分而治之分割/歇征服/解决合并/合并实例23.动态规划对照实例34.基本概念算法数据定义数据对象内置数据类型派生数据类型基本操作1.贪婪算法 设计算法以实现给定问题的最佳解决方案。在贪婪算法方法中&am…

中国蚁剑AntSword实战

中国蚁剑AntSword实战1.基本使用方法2.绕过安全狗连接3.请求包修改UA特征伪造RSA流量加密4.插件使用1.基本使用方法 打开蚂蚁宝剑&#xff0c;右键添加数据&#xff1a; 输入已经上传马的路径和连接密码&#xff1a; 测试连接&#xff0c;连接成功&#xff01; GetShell了&…

【Linux】权限详解

前言首先我们先来看一下权限的概念&#xff1a;在多用户计算机系统的管理中&#xff0c;权限&#xff08;privilege&#xff09;是指某个特定的用户具有特定的系统资源使用权力&#xff0c;像是文件夹&#xff0c;特定系统指令的使用或存储量的限制。通常&#xff0c;系统管理员…

动态内存管理详细讲解

目录 1.为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 今天要和大家分享的内容是的动态内存管理&#xff0c;我们先从他的定义入手学习。 1.为什么存在动态内存分配 我们到现在已经掌握了内存开辟的方式就是要么创建一个变量…
最新文章