【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…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
