当前位置: 首页 > news >正文

【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 中的作用域链&#xff08;Scope chain&#xff09;是一种用于查找变量和函数的机制&#xff0c;它是由嵌套的作用域环境组成的链式结构。 当在 JavaScript 中访问一个变量或函数时&#xff0c;解析器会首先在当前作用域…...

零售品牌私域流量池如何运营?火山引擎数智平台提供全套产品组合

虽然距离6月18日还有两周时间&#xff0c;但各大平台的第一波618战绩&#xff08;预售尾款&#xff09;已经相继出炉。 5月31日晚8点&#xff0c;京东率先公布618开门红10分钟销售战报&#xff1a;10分钟内&#xff0c;成交额破亿品牌数同比增长23%&#xff0c;超六成的新商家…...

rk3568 SD卡启动

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

English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三

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

【运筹优化】最短路算法之A星算法 + Java代码实现

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

[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00

目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 ​2…...

Webots R2021a教程

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

C++ 输出格式控制

C 输出格式控制 需包含头文件&#xff1a; 浮点数精度、域宽、填充 操作符功能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 左值持久&#xff1b;右值短暂 3.3 变量是左值 3.4 标准库move函数 1.…...

NodeJS MongoDB⑦

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 &#xff08…...

情感分析实战(中文)-共现语义篇

情感分析实战(中文)-共现语义网络分析 背景:该专栏的目的是将自己做了N个情感分析的毕业设计的一个总结版,不仅自己可以在这次总结中,把自己过往的一些经验进行归纳,梳理,巩固自己的知识从而进一步提升,而帮助各大广大学子们,在碰到情感分析的毕业设计时,提供一个好的…...

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列&#xff08;静态队列&#xff09;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是固态硬盘&#xff0c;普通的ssd配的是SATA口&#xff08;AHCI协议&#xff09;&#xff0c;nvme ssd配的是PCIe口&#xff08;nvme传输协议&#xff09; 相比普通SSD的SATA口&#xff0c;nvme的PCIe口有巨大的性能优势。 更多详情见&…...

硬件设计电源系列文章-DCDC转换器布局设计

文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示&#xf…...

「从入门到精通,一位设计师分享学习Illustrator的技巧和经验!」

学习Illustrator的个人笔记&#xff1a;从入门到精通 Adobe Illustrator是一款广泛使用的矢量图形软件&#xff0c;用于创建各种设计作品&#xff0c;如商标、海报、名片等。在本篇博客中&#xff0c;我将分享学习Illustrator的经验和技巧&#xff0c;帮助您更好地掌握这一工具…...

RedisGraph的整体架构

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

C#可视化 家用轿车信息查询系统(具体做法及全部代码)

目录 题目&#xff1a; 效果图&#xff1a; 数据库&#xff1a; 做法&#xff1a; combobox值更新 查询按钮功能&#xff08;非空验证&#xff0c;查询数据&#xff09; datagirdview设置 全部代码&#xff1a; DBHelper类 From1主窗体代码 题目&#xff1a; 效果图&#…...

Nautilus Chain全球行分享会,上海站圆满举办

在北京时间 6 月 9 日&#xff0c;由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动&#xff0c;在上海顺利举办&#xff0c;本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz La…...

OpenClaw多模态扩展:Qwen3.5-4B-Claude处理截图与PDF

OpenClaw多模态扩展&#xff1a;Qwen3.5-4B-Claude处理截图与PDF 1. 为什么需要多模态能力&#xff1f; 去年夏天&#xff0c;我遇到一个头疼的问题&#xff1a;需要从几百份PDF报告里提取关键数据。手动复制粘贴不仅耗时&#xff0c;还容易出错。当时我就在想&#xff0c;如…...

语音播报实时

目录 GPT-SoVITS&#xff08;强烈推荐&#xff09; Fish Speech-1.5 GPT-SoVITS&#xff08;强烈推荐&#xff09; RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) Fish Speech-1.5 追求极致流畅的实时对话&a…...

设计师必看:Photoshop混合模式实战指南,5分钟搞定光影合成与氛围感调色

Photoshop混合模式实战指南&#xff1a;5分钟掌握光影合成与氛围调色 当你在深夜赶稿时&#xff0c;突然发现人物照片缺乏立体感&#xff0c;或是产品静物图需要增强戏剧性光影——这就是混合模式大显身手的时刻。不同于繁琐的曲线调整和复杂的蒙版操作&#xff0c;混合模式就像…...

从零开始:如何用开源方案打造你的第一台六足机器人

从零开始&#xff1a;如何用开源方案打造你的第一台六足机器人 【免费下载链接】hexapod 项目地址: https://gitcode.com/gh_mirrors/hexapod5/hexapod 想要亲手制作一台能够自如行走的六足机器人吗&#xff1f;hexapod开源项目为你提供了一套完整的免费解决方案&#…...

别再让PowerBI报告挤成一团了!用按钮+书签,一个页面搞定趋势和明细分析

PowerBI交互设计进阶&#xff1a;用按钮与书签打造空间魔术 当业务分析报告遇上数据爆炸时代&#xff0c;信息过载与界面拥挤成为每个分析师挥之不去的噩梦。我曾见过某零售企业的季度分析仪表板——12个图表密密麻麻挤在A4纸大小的画布上&#xff0c;趋势线相互缠绕&#xff…...

手把手教你用XCVU3P和FMC+接口搭建高性能PCIe载板(附原理图下载)

基于XCVU3P与FMC的高性能PCIe载板开发实战指南 在当今高速数据处理领域&#xff0c;FPGA因其并行计算能力和可重构特性成为关键器件。Xilinx UltraScale系列的XCVU3P芯片配合FMC扩展接口&#xff0c;为开发者提供了强大的硬件加速平台。本文将深入解析如何从零开始构建一个支持…...

Lobe Theme:为Stable Diffusion WebUI注入现代设计美学的终极界面解决方案

Lobe Theme&#xff1a;为Stable Diffusion WebUI注入现代设计美学的终极界面解决方案 【免费下载链接】sd-webui-lobe-theme &#x1f92f; Lobe theme - The modern theme for stable diffusion webui, exquisite interface design, highly customizable UI, and efficiency …...

如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南

如何快速掌握Windows文件夹色彩管理&#xff1a;Folcolor免费工具终极指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 你是否曾在密密麻麻的黄色文件夹中迷失方向&#xff1f;每天花费…...

java自动带注释

...

Python子解释器隔离全解密(从PyThreadState到_PyInterpreterState):20年源码级剖析,首次公开CPython内部隔离边界图谱

第一章&#xff1a;Python子解释器隔离的演进脉络与核心挑战Python长期以来依赖全局解释器锁&#xff08;GIL&#xff09;保障线程安全&#xff0c;但这也限制了真正的并行执行能力。为突破这一瓶颈&#xff0c;CPython自3.12起正式引入子解释器&#xff08;subinterpreters&am…...