JAVA集合框架、CAS、AQS

目录

一、java 的集合框架有哪些?

二、说-下 ArrayList 和 LinkedList?

三、HashSet和TreeSet的区别?

四、HashMap 的数据结构是什么?

五、CAS机制

六、AQS理解


一、java 的集合框架有哪些?

Collection 是 Java 集合框架中的一个根接口,位于 java.util 包中。它代表了一组对象,即它是一个对象的集合。

二、说-下 ArrayList 和 LinkedList?

        ArrayList 是最常用的 List 实现类, 内部是通过数组实现的, 它允许对元素进行快速随机访问。数 组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数 组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进 行复制、移动、代价比较高。因此, 它适合随机查找和遍历, 不适合插入和删除。

        LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较 慢。另外,他还提供了List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆 栈、队列和双向队列使用。

  • 数组实现List:数组是一种连续的内存空间,通过索引可以快速地访问任意位置的元素,这符合 List 接口中按索引访问元素的需求。此外,数组可以通过动态扩容来支持动态增长的集合。
  • 链表实现LinkedList:链表通过节点间的引用关系来组织数据,这种结构使得在链表的任意位置插入或删除元素变得非常简单和高效,而不需要移动其他元素。这符合 List 接口中要求支持动态添加、删除和访问元素的需求。

三、HashSet和TreeSet的区别?

        HashSet:元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样, 接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是 同一个元素。

        TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序), 每增 加一个对象都会进行排序,将对象插入的二叉树指定的位置。

        Integer 和 String 对象都可以进行默认的 TreeSet 排序, 而自定义类的对象是不可以的, 自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。

HashSet

        无序:不保证元素的插入顺序。

        唯一性:通过equals()方法确保集合中元素的唯一性,允许一个null元素。

        性能:在添加、删除和查找操作上通常比TreeSet快,时间复杂度接近O(1)。

        用途:适用于需要快速查找且不要求排序的场合。

TreeSet

        有序:根据元素的自然顺序或构造时指定的Comparator进行排序。

        唯一性:通过compareTo()方法(或Comparator的compare方法)确保集合中元素的唯一性,不允许null元素。

        性能:在添加、删除和查找操作上的时间复杂度为O(log n),因为基于红黑树实现。

        用途:适用于需要保持元素排序的场合。

四、HashMap 的数据结构是什么?

        底层是采用数组结构来存储数据元素,默认长度16,通过put方法去添加数据hashmap会根据key的hash值进行取模运算,最终把值保存到数组的一个指定位置,这样会存在hash冲突:两个不同的hash值的key,最终取模会落到同一个数组下标,所以引入了链式寻址法来解决hash冲突,对应存在冲突的key,hashmap 把这些key 组成一个单项链表,然后采用尾插法 把key保存到链表的一个尾部,另外为了避免链表长度过长,导致我的查询效率下降,所以当链表长度大于8,并且数组长度大于64,hashmap会把当前链表转换为红黑树,从而减少链表数据查询的时间复杂度,来提升查询效率。

HashMap 是线程安全的吗?为什么?

  1. 非同步操作:HashMap的操作不是线程同步的。在多线程环境下,如果有多个线程同时对HashMap进行读写操作,就可能导致数据不一致的问题。因为HashMap没有采取任何措施来同步这些操作,所以无法保证操作的原子性和可见性。
  2. 非原子性操作:HashMap的某些操作(如put()方法)包含多个步骤,如计算哈希值、查找或插入元素等。这些步骤如果由不同的线程并发执行,就可能因为中间状态的可见性问题而导致数据不一致。
  3. 容量扩容:当HashMap中的元素数量超过其容量的一定比例时,HashMap会进行扩容操作。这个过程包括重新计算元素的哈希值、重新分配存储位置,并复制原数组中的元素到新数组中。如果在这个过程中有其他线程对HashMap进行修改,就可能导致数据丢失或出现异常。

知道线程安全的 Map 有哪些?

hashtable:在put、get、containsKey方法上添加synchronized关键字来保证线程安全

ConcurrentHashMap

ConcurrentHashMap 为什么是线程安全的?

整体架构:

jdk1.8 由数组+红黑树+单向链表构成,默认初始化长度16的数组,由于核心仍是hashmap,必然会存在hash冲突, 所有concurrenthashmap 采用链式寻址的方式解决hash 冲突,当hash冲突比较多的时候,会造成链表长度问题, 1.8引入红黑树,当数组长度大于64,并且链表长度大于8,单向链表会转化为红黑树。当链表长度小于8,红黑树就会退化为单项链表

基本功能:在hashmap基础上提供了并发安全的实现,通过对于node节点去加锁,来保证数据更新的安全性,性能方面优化

        jdk1.8 concurrent。。。 的锁粒度是数组中某一个节点,

        jdk1.7 锁定的是segment 锁的范围要更大,性能上会更低,

        引入红黑树,降低数据查询的时间复杂度

        当数组长度不够的时候,对数组进行扩容, 引入了多线程并发扩容(多个线程对原始数组进行分片),每个线程负责对一个分片的迁移。

五、CAS机制

cas 是java中unsafe类里面的一个方法,全称:CompareAndSwap 比较并交换

主要功能: 保证在多线程环境下,对于共享变量修改的一个原子性

例子: 有一个成员变量state默认值为0 ,定义了一个方法,逻辑为,先判断state 是否为0,如果为0 就修改为1,在单线程没有任何问题,多线程下会存在原子性问题

是一个 read -write 操作, 一般解决会在方法 加 synchronized同步锁来解决,但 是加锁 会带来性能上的损耗, 所以可以采用cas 机制进行优化 调用 compareandswaplint

六、AQS理解

AQS是多线程同步器,提供了两种锁的机制

排它锁:存在多个线程去竞争同一共享资源的时候,同一时刻只允许一个线程去访问这样一个共享资源,也就是多个线程中只能有一个线程去获得一个锁资源,比如 lock中的Reentrantlock重入锁,就是用到了aqs中排它锁功能

共享锁:也称为读锁,同一时刻允许多个线程同时获得锁的资源

aqs作为互斥锁 需要解决三个核心问题

        6.1、互斥变量的设计 如何保证多线程同时更新互斥变量的时候线程的安全性

        采用int 类型的互斥变量 state,用来记录锁竞争的状态 (0--没有 >=1 有线程持有)

        6.2、线程获取锁资源 先会判断 state 是否为0 如果是 更新状态为1 表示占有到锁

        如果多个线程同时做一个操作,导致线程安全性问题,aqs 采用cas机制保证state

互斥变量更新的一个原子性

        6.3、未竞争到锁资源的线程等待 以及竟遭到锁的资源释放锁之后的唤醒

        为获取到的线程 通过unsafe类中的park方法,去进行阻塞,把阻塞的线程按照先进先出的原则去加入到一个双向链表的一个结构中当获取到锁资源的线程释放锁之后,会从双向链表的头部去唤醒下一个等待的线程,再去竞争锁

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

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

相关文章

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

微笑背后的秘密:理解自闭症儿童的面部表情控制

在星贝育园自闭症儿童康复学校&#xff0c;我们常常遇到家长们提出的一个有趣而引人深思的问题&#xff1a;“为什么我的孩子似乎控制不住面部表情&#xff0c;尤其是频繁地笑&#xff1f;”这个问题背后&#xff0c;隐藏着自闭症谱系障碍&#xff08;ASD&#xff09;儿童独特的…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…

20240707 每日AI必读资讯

&#x1f9e0;中国生成式AI专利数量超过美国 6 倍 - 中国在2014年至2023年期间申请的生成式AI专利数量达到38210个&#xff0c;超过了美国的6倍。 - 腾讯、平安保险集团和百度是GenAI专利数量最多的中国公司。 - 中国的顶级学术机构和技术生态为生成式AI的发展提供了强大支持…

算法简介:什么是算法?——定义、历史与应用详解

引言 在现代计算机科学中&#xff0c;算法是一个核心概念。无论是编程还是数据分析&#xff0c;算法都扮演着至关重要的角色。在这篇博客中&#xff0c;我们将深入探讨算法的定义、历史背景以及它在计算机科学中的地位和实际应用。 什么是算法&#xff1f; 算法是解决特定问题…

DHCP的原理及配置

目录 一、了解DHCP服务 1.什么是DHCP 1.1DHCP广播 2.使用DHCP的好处 2.1为什么使用DHCP 3.DHCP的模式与分配方式 3.1分配方式 3.2模式 二、DHCP工作原理 1.四次回话 2.重新登录 3.更新租约 4.扩展 三、安装DHCP服务 四、DHCP局部配置并且测试 五、使用…

简介空间复杂度

我们承接上一篇博客。我们写了时间复杂度之后&#xff0c;我们就要来介绍一下另一个相关复杂度了。空间复杂度。我觉得大家应该对空间复杂度认识可能比较少一些。我就是这样&#xff0c;我很少看见题目中有明确要求过空间复杂度的。但确实有这个是我们不可忽视的&#xff0c;所…

在门店里造绿色氧吧!康养行业也这么卷了?

拼啥不如拼健康&#xff0c;现在的人算是活明白了&#xff0c;不但中老年人这样想&#xff0c;年轻人也这样干。你可能不知道&#xff0c;现在众多健康养生门店&#xff0c;逐渐成了年轻人“组团养生”的好去处&#xff0c;也是他们吃喝玩乐之外的新兴消费趋势。 而在看得见的…

无需服务器,浏览器跑700+AI模型?!【送源码】

Transformers.js 是一个创新的网络机器学习库&#xff0c;它将先进的 Transformer 模型直接带入浏览器&#xff0c;无需服务器端支持。这个库与 Hugging Face 的 Python transformers 库功能对等&#xff0c;提供相似的 API 接口来运行预训练模型&#xff0c;涵盖了自然语言处理…

Java引用的4种类型:强、软、弱、虚

在Java中&#xff0c;引用的概念不仅限于强引用&#xff0c;还包括软引用、弱引用和虚引用&#xff08;也称为幻影引用&#xff09;。这些引用类型主要用于不同的内存管理策略&#xff0c;尤其是在垃圾收集过程中。以下是对这四种引用类型的详细解释&#xff1a; 1. 强引用&am…

【实践分享】深度学习远程连接GPU

目录 前言 一、创建实例 二、上传文件 三、服务器上传 四、运行代码文件 前言 1、使用平台&#xff1a;恒源云 2、教程总结自B站大佬Larry同学发布的教程视频 一、创建实例 通俗&#xff1a;租用一台临时的电脑&#xff0c;电脑可自选GPU型号等&#xff0c;按照项目需…

品质至上!中国星坤连接器的发展之道!

在电子连接技术领域&#xff0c;中国星坤以其卓越的创新能力和对品质的不懈追求&#xff0c;赢得了业界的广泛认可。凭借在高精度连接器设计和制造上的领先地位&#xff0c;星坤不仅获得了多项实用新型专利&#xff0c;更通过一系列国际质量管理体系认证&#xff0c;彰显了其产…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文&#xff1a;arxiv.org/pdf/2312.00858 代码&#xff1a;horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式&#xff0c;从模型架构的角度加速了扩散模型。DeepCache利…

树(相关知识点)

目录 结点的度&#xff1a;某一个结点所含有字数的个数 叶节点&#xff1a;最后一个结点 非终端节点:不是叶结点 兄弟结点&#xff1a;亲兄弟结点 树的度&#xff1a;最大节点的度 层次&#xff1a;根为第一层&#xff0c;根的子结点为第二层&#xff0c;以此类推 森林&am…

[附源码]基于Flask的演唱会购票系统

摘要 随着互联网技术的普及和发展&#xff0c;传统购票方式因其效率低下、流程繁琐等问题已难以满足现代社会的需求。本文设计并实现了一个基于Flask框架的演唱会购票系统&#xff0c;该系统集成了用户管理、演唱会信息管理、票务管理以及数据统计与分析等功能模块&#xff0c…

linux centos7.9 安装mysql5.7;root设置客户端登录、配置并发、表名大小写敏感等

查看centos版本 cat /etc/centos-releasecentos版本为7.9 查看是否已安装mariadb,安装了需要先删除 1.查看是否安装了mariadb和mysql&#xff0c;安装了需要先删除 mariadb是mysql的一个分支&#xff0c;但要安装mysql需要删除它 执行rpm -qa|grep mariadb,查看mariadb情况…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

AI大模型技术分析

一文读懂&#xff1a;AI大模型&#xff01; 引言 近年来&#xff0c;随着深度学习技术的迅猛发展&#xff0c;AI大模型已经成为人工智能领域的重要研究方向和热点话题。AI大模型&#xff0c;指的是拥有巨大参数规模和强大学习能力的神经网络模型&#xff0c;如BERT、GPT等&…

java IO流(1)

一. 文件类 java中提供了一个File类来表示一个文件或目录(文件夹),并提供了一些方法可以操作该文件 1. 文件类的常用方法 File(String pathname)构造方法,里面传一个路径名,用来表示一个文件boolean canRead()判断文件是否是可读文件boolean canWrite()判断文件是否是可写文…

spring boot读取yml配置注意点记录

问题1&#xff1a;yml中配置的值加载到代码后值变了。 现场yml配置如下&#xff1a; type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…