【Java】Java核心要点总结:58
文章目录
- 1. java中 怎么确保一个集合不能被修改
- 2. 队列和栈是什么 有什么区别
- 3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁
- 4. ConcurrentHashMap 和 Hashtable有什么区别
- 5. ReadWriteLock和StampeLock
1. java中 怎么确保一个集合不能被修改
Java 中可以使用 Collections 类的 unmodifiableXXX() 方法来确保一个集合不能被修改。其中,XXX 表示需要被转换的集合类型,如 List、Set、Map 等。这些方法都返回指定集合的不可修改视图。
例如,如果需要确保一个 List 集合不能被修改,可以使用以下方法:
List<String> list = new ArrayList<>();
// 往集合中添加元素List<String> unmodifiableList = Collections.unmodifiableList(list);
// 将 List 转换为不可修改的视图unmodifiableList.add("element"); // 会抛出 UnsupportedOperationException 异常
在上述代码中,将一个 ArrayList 集合转换为了不可修改的 List 视图,并且尝试向该视图中添加新元素,此时会抛出 UnsupportedOperationException 异常。
需要注意的是,虽然通过 unmodifiableXXX() 方法返回的集合视图可以防止对其进行新增、移除、修改等操作,但实际上集合元素本身并没有被修改,因此如果原始集合发生了变化,集合视图也会发生变化。因此,需要确保不会通过其他方式来修改原集合。
2. 队列和栈是什么 有什么区别
队列和栈都是常见的数据结构,其主要区别在于元素的插入和删除顺序不同。
队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构,类似于排队等待服务。新元素总是被添加到队列的尾部,而最先被添加的元素则总是位于队列的头部,也就是说,在队列中,先进入队列的元素也会先被处理。我们可以通过调用队列的 offer() 方法向队列的尾部添加元素,可以通过 poll() 方法从队列的头部删除元素。
栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于叠罗汉。新元素总是被添加到栈的顶部,而最上面的元素则总是最后一个被处理,也就是说,在栈中,后进入的元素先被处理。我们可以通过调用栈的 push() 方法向栈的顶部添加元素,可以通过 pop() 方法从栈的顶部删除元素。
另外,还有一个明显的区别是队列允许在任何时候插入和删除元素,而栈只能在栈顶进行操作。此外,队列通常有多种实现方式,如线性队列、循环队列和阻塞队列等,每种实现方式都有其特点和适用场景;而栈的实现方式相对单一,大多数情况下只需要使用基本的数组或链表即可。
因此,当需要处理一些按顺序排列的元素集合时,需要先进先出的情况下就可以选择使用队列,如事件、消息等系统;而对于需要依次处理栈顶的情况,就可以使用栈,如表达式求值、函数调用等场景。
3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁
Java8开始的ConcurrentHashMap舍弃了分段锁,主要是为了提高并发性能,这是因为在高并发下使用分段锁会出现一些缺点。
首先,基于分段锁的 ConcurrentHashMap 在处理高并发场景时会出现频繁的竞争,每当有新元素插入到集合中或者需要进行调整时,需要加锁来保证原子性,在竞争激烈的情况下加锁的开销会显得很大,阻碍整个系统的并发度。
其次,分段锁本身也存在一些问题,例如需要维护多个锁对象、容易产生死锁等。虽然 JDK 7 中的 ConcurrentHashMap 引入了 Resize 的方式减少锁的争用,但在极端情况下仍然难以避免锁引起的性能问题。
而在 Java8 中,ConcurrentHashMap 对底层数据结构进行了重构,在实现上使用了 CAS 操作(Compare And Swap,比较并交换)和内存屏障等机制,可以实现更高效的非阻塞并发操作。这种方式在多线程访问时避免了锁的开销,在性能表现上能够更好地支持高并发访问,相对于分段锁提供了更好的性能和可扩展性。
另外,在 Java8 中还引入了红黑树(Red-Black Tree)来代替链表,解决了 JDK 7 中并发度低且插入元素慢的问题,同时也让每个线程拥有尽量少的锁操作。这些改进与优化,都大大提升了 ConcurrentHashMap 的效率和性能表现。
4. ConcurrentHashMap 和 Hashtable有什么区别
ConcurrentHashMap 和 Hashtable 都是线程安全的集合类,它们之间有以下几点区别:
同步方式不同
Hashtable 通过 synchronized 关键字来实现同步,对整个对象进行锁定,因此同一时刻只能有一个线程访问该对象。而 ConcurrentHashMap 则通过分段锁(JDK7及之前版本)或者无锁算法(JDK8及以上版本)来实现同步,不同的线程可以同时访问不同部分的数据,因此并发度相对较高,性能也更好。
数据结构不同
Hashtable 的数据结构是数组加链表,当一个链表中元素过多时,会产生严重的时间复杂度优化问题。ConcurrentHashMap在 JDK8 版本后引入红黑树来解决这个问题。
空值和空键的处理不同
Hashtable 不允许 null 值和 null 键,如果以 null 作为 key 或 value 的话则会抛出 NullPointerException。而 ConcurrentHashMap 允许 null 值和 null 键。
迭代器的弱一致性策略不同
当其他独立线程改变了 ConcurrentHashMap 集合中的某个数值时,迭代器仍然可以继续工作,而对于 Hashtable 则不能并发迭代,因为 iterators 在遍历时要锁定整个表格,所以将导致其他线程的所有访问被阻塞。
ConcurrentHashMap 相对于 Hashtable 具有更好的并发性和可伸缩性,在高并发场景下,使用 ConcurrentHashMap 可以提供更优秀的性能表现。
5. ReadWriteLock和StampeLock
ReadWriteLock和StampeLock都是Java并发包中提供的锁机制,它们旨在优化对于读写的并发操作。
ReadWriteLock
ReadWriteLock 接口定义了一个读/写锁,它可以同时允许多个线程读取共享资源,但只允许一个线程写入共享资源,当进行写锁定时,所有读取线程和其他写线程请求该锁定将被阻塞。与一般的 Lock 实现不同的是,ReadWriteLock 允许多个线程同时访问某个资源,以达到提高读取操作性能的目的,在读多写少的场景下,使用 ReadWriteLock 可以有效减小锁竞争,提高并发效率。
StampedLock
StampedLock 的实现基于乐观锁的思想,也是为了优化读操作执行的速度而设计的一种锁机制。由于读取操作比写操作更快,StampedLock 采用乐观策略,当进行读取操作时,会尝试乐观获取锁,如果成功,则直接返回数据,否则就退化成传统的悲观锁来获取锁。StampedLock 中也有三种模式:写模式、悲观读模式和乐观读模式。StampedLock 支持可重入,并提供了将悲观锁降级为乐观锁的方法。
在读多写少的场景下,使用读写锁(ReadWriteLock)或 StampedLock 可以取得很好的性能提升效果。但需要注意的是,并不是所有的场景都适合使用读写锁或 StampedLock,在存在大量写操作并且这些写操作耗时很长的情况下,这两种锁机制可能会导致读操作被阻塞,进而影响系统的响应时间。
相关文章:

【Java】Java核心要点总结:58
文章目录 1. java中 怎么确保一个集合不能被修改2. 队列和栈是什么 有什么区别3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁4. ConcurrentHashMap 和 Hashtable有什么区别5. ReadWriteLock和StampeLock 1. java中 怎么确保一个集合不能被修改 Java 中可以使用 Collectio…...
前端面试题---作用域链和原型链
一.JavaScript 中的作用域链是如何工作的? JavaScript 中的作用域链(Scope chain)是一种用于查找变量和函数的机制,它是由嵌套的作用域环境组成的链式结构。 当在 JavaScript 中访问一个变量或函数时,解析器会首先在当前作用域…...
零售品牌私域流量池如何运营?火山引擎数智平台提供全套产品组合
虽然距离6月18日还有两周时间,但各大平台的第一波618战绩(预售尾款)已经相继出炉。 5月31日晚8点,京东率先公布618开门红10分钟销售战报:10分钟内,成交额破亿品牌数同比增长23%,超六成的新商家…...

rk3568 SD卡启动
rk3568 SD卡启动 SD卡启动系统,它可以让rk3568在没有硬盘或其他存储设备的情况下启动和运行操作系统。这使得rk3568变得与树梅派一样灵活切换系统,与此同时进行故障排查和修复,而不需要拆卸设备或者使用专业的烧录工具。SD卡启动还可以方便地…...

English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三
English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三 引言🍉句1: The woman reading the romantic novel could be a lawyer.成分划分弱读连读爆破语调 🍉句2: She just wants a light read to take her mind off work.成分划分弱读连读爆破语调…...

【运筹优化】最短路算法之A星算法 + Java代码实现
文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 二、A星算…...

[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00
目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 2…...

Webots R2021a教程
文章目录 Windows安装设置中文打开世界添加贴图 为外部控制器配置Anaconda解决报错:CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue.调用Python API Windows 安装 进入下载页面 https://github.com/cyberbotics/webots/r…...

C++ 输出格式控制
C 输出格式控制 需包含头文件: 浮点数精度、域宽、填充 操作符功能right-alignedright-alignedsetprecision(int n)设置以n表示的数值精度setw(int n)设置以n表示的域宽setfill(char c)设置以c表示的填充字符 输出格式 操作符功能oct以八进制格式输出数据dec以…...

【C++】引用和右值引用
目录 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的使用场景 1.3.1 作为参数 1.3.2 作为返回值 1.4 常量引用 1.5 引用和指针的区别 2. 左值和右值 3. 右值引用 3.1 右值引用的概念 3.2 左值持久;右值短暂 3.3 变量是左值 3.4 标准库move函数 1.…...

NodeJS MongoDB⑦
文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 (…...
情感分析实战(中文)-共现语义篇
情感分析实战(中文)-共现语义网络分析 背景:该专栏的目的是将自己做了N个情感分析的毕业设计的一个总结版,不仅自己可以在这次总结中,把自己过往的一些经验进行归纳,梳理,巩固自己的知识从而进一步提升,而帮助各大广大学子们,在碰到情感分析的毕业设计时,提供一个好的…...

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)
一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…...

【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?
上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…...

【协议】NVMe over RoCE |nvmeof
什么是nvme nvme ssd和普通ssd区别 ssd是固态硬盘,普通的ssd配的是SATA口(AHCI协议),nvme ssd配的是PCIe口(nvme传输协议) 相比普通SSD的SATA口,nvme的PCIe口有巨大的性能优势。 更多详情见&…...

硬件设计电源系列文章-DCDC转换器布局设计
文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示:这里可以添加技术概要 例如: 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示…...
「从入门到精通,一位设计师分享学习Illustrator的技巧和经验!」
学习Illustrator的个人笔记:从入门到精通 Adobe Illustrator是一款广泛使用的矢量图形软件,用于创建各种设计作品,如商标、海报、名片等。在本篇博客中,我将分享学习Illustrator的经验和技巧,帮助您更好地掌握这一工具…...

RedisGraph的整体架构
The architecture of RedisGraph 本文关注RedisGraph的整体架构,分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构,最重要的就是其图存储模型,即其中的…...

C#可视化 家用轿车信息查询系统(具体做法及全部代码)
目录 题目: 效果图: 数据库: 做法: combobox值更新 查询按钮功能(非空验证,查询数据) datagirdview设置 全部代码: DBHelper类 From1主窗体代码 题目: 效果图&#…...

Nautilus Chain全球行分享会,上海站圆满举办
在北京时间 6 月 9 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在上海顺利举办,本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz La…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...