版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java工程师面试题库及详细答案解析(企业高频真题)本题库汇总互联网、传统软件企业Java岗位高频面试题,覆盖Java基础、集合框架、多线程并发、JVM、Spring全家桶、数据库交互、实操编程、性能优化八大核心模块,题目均为一线企业常考真题,答案贴合实际开发场景,摒弃理论化空话,适配初级、中级Java工程师面试备考。第一部分Java基础高频面试题(20题)本部分为面试必考题,侧重基础概念辨析、语法细节、底层原理,是所有Java岗位面试首轮核心考察内容1.简述JDK、JRE、JVM的区别与联系答案解析:三者是层层包含的关系,核心定位完全不同:JVM是Java虚拟机,是Java程序运行的核心载体,负责加载字节码文件、执行程序、内存管理、垃圾回收,是Java跨平台的核心支撑,只负责运行程序,不包含编译工具。JRE是Java运行环境,包含JVM和Java核心运行类库(rt.jar等),专门用于运行已编译好的Java程序,普通用户运行Java软件只需安装JRE。JDK是Java开发工具包,包含JRE、Java编译工具(javac)、调试工具、打包工具等开发必备组件,是开发Java程序的必备环境,开发人员必须安装JDK。总结:JDK⊃JRE⊃JVM,开发用JDK,运行程序用JRE,程序运行依托JVM。2.Java基本数据类型有哪些?和包装类的区别是什么?答案解析:Java共有8种基本数据类型:整型:byte、short、int、long;浮点型:float、double;字符型:char;布尔型:boolean对应的包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean核心区别:1.存储方式:基本类型直接存储数值,占用内存小;包装类是对象,存储在堆内存,包含对象头信息,占用内存更大。2.默认值:基本类型有固定默认值(int默认0、boolean默认false);包装类默认值为null。3.泛型支持:泛型不支持基本类型,只能使用包装类。4.功能拓展:包装类提供大量工具方法,比如类型转换、数值比较、最值获取等,基本类型无额外方法。3.什么是自动装箱和自动拆箱?底层原理是什么?答案解析:自动装箱:基本类型自动转换为对应的包装类对象,如Integera=10;自动拆箱:包装类对象自动转换为基本类型,如intb=a;底层原理:编译阶段由编译器自动完成转换,无需手动调用方法。装箱时默认调用valueOf()方法,拆箱时默认调用xxxValue()方法(如intValue())。补充高频坑点:Integer存在缓存机制,-128~127范围内的数值,装箱会复用缓存对象,超出范围会新建对象,因此范围内数值==比较为true,范围外为false。4.==和equals()的区别?答案解析:1.适用范围:==可以比较基本类型和引用类型;equals()仅能比较对象,是Object类的方法。2.比较规则:基本类型中,==比较数值是否相等;引用类型中,==比较对象的内存地址是否相同。3.equals()默认规则:Object类原生equals()方法等价于==,比较内存地址;String、Integer等包装类重写了该方法,重写后比较的是对象的内容数值。开发规范:比较字符串、包装类数值时,优先使用equals(),避免地址比较导致的逻辑错误。5.String、StringBuilder、StringBuffer的区别?答案解析:1.可变性:String是不可变字符串,每次拼接都会生成新字符串对象;StringBuilder和StringBuffer是可变字符串,直接修改原对象,不产生新对象。2.线程安全:StringBuffer所有方法加了synchronized锁,线程安全,适合多线程场景;StringBuilder无锁,线程不安全,性能更高。3.性能:单线程场景下,StringBuilder性能>StringBuffer>String;多线程并发操作字符串,必须使用StringBuffer。4.使用场景:少量字符串拼接用String;单线程大量拼接用StringBuilder;多线程大量拼接用StringBuffer。6.为什么String是不可变的?有什么好处?答案解析:底层原因:String底层通过final修饰的char数组(JDK9后为byte数组)存储字符,数组被final修饰,无法引用新数组,且String类被final修饰,不能被继承,内部方法无法被重写,保证了数值不可修改。核心好处:1.字符串常量池复用:不可变特性让字符串可以存入常量池,实现全局复用,节省内存空间。2.线程安全:字符串不可被修改,多线程并发访问时不会出现数据错乱,天然线程安全。3.保证哈希值稳定:String的hashCode值创建后固定,适合作为HashMap、HashSet的key。7.final、finally、finalize的区别?答案解析:三者无关联,是三个完全不同的Java语法机制:1.final:是修饰符,可修饰类、方法、变量。final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量,只能赋值一次。2.finally:是异常处理关键字,搭配try-catch使用,代码块中的代码无论是否出现异常、是否return,都会执行,常用于释放资源(关闭流、数据库连接)。3.finalize:是Object类的废弃方法,JDK9已废弃。原本用于垃圾回收前唤醒,让对象完成资源收尾,执行时机不确定、无法保证执行,开发中禁止使用。8.接口和抽象类的区别?答案解析:1.定义关键字:抽象类用abstract定义;接口用interface定义。2.继承规则:类只能单继承抽象类;类可以多实现接口,接口可以多继承接口。3.成员特性:抽象类可以有构造方法、普通成员变量、静态变量、普通方法、抽象方法;接口默认只能有常量、抽象方法(JDK8后支持默认方法、静态方法,JDK9支持私有方法),无构造方法。4.设计思想:抽象类是对事物的抽象,包含属性和行为;接口是对行为的抽象,仅定义行为规范。使用场景:存在父子层级、有共享属性用抽象类;统一行为规范、多拓展、解耦用接口。9.重写和重载的区别?答案解析:1.定义位置:重载发生在同一个类中;重写发生在子类和父类之间。2.方法规则:重载要求方法名相同,参数列表(个数、类型、顺序)不同,返回值、修饰符无要求;重写要求方法名、参数列表、返回值完全一致,权限修饰符范围大于等于父类,不能抛出更宽泛的异常。3.触发机制:重载是编译期多态(静态绑定);重写是运行期多态(动态绑定)。核心口诀:重载看参数,重写看父子;编译找重载,运行找重写。10.Java的四种引用类型及应用场景答案解析:Java按垃圾回收优先级分为四种引用,强度从高到低:1.强引用:默认引用方式,只要有强引用指向对象,GC永远不会回收,普通对象创建(Objectobj=newObject())都是强引用,日常开发最常用。2.软引用(SoftReference):内存充足时不回收,内存溢出前一定会回收,适合缓存场景(图片缓存、本地临时数据缓存)。3.弱引用(WeakReference):只要触发GC就会被回收,生命周期极短,适合存储非核心数据,典型应用:ThreadLocal、WeakHashMap。4.虚引用(PhantomReference):最弱的引用,无法获取对象实例,仅用于监控对象垃圾回收状态,主要用于堆外内存回收、资源监控。11.异常体系中Error和Exception的区别?答案解析:1.层级关系:Error和Exception都继承自Throwable,是Java异常体系的顶层父类。2.性质不同:Error是系统级严重错误,属于不可修复错误;Exception是程序级异常,可通过代码捕获处理。3.处理方式:Error无需捕获,无法处理,出现后程序直接崩溃,如OOM内存溢出、栈溢出;Exception可通过try-catch捕获、throws抛出,保证程序正常运行。4.细分:Exception分为编译时异常(受检异常,必须处理)和运行时异常(RuntimeException,无需强制处理,如空指针、数组越界)。12.泛型的作用和原理?什么是泛型擦除?答案解析:泛型核心作用:编译期类型校验,避免类型转换异常,简化强制类型转换代码,实现代码复用。底层原理:Java泛型是伪泛型,基于泛型擦除实现。编译阶段编译器校验泛型类型,编译完成后会擦除所有泛型信息,替换为原始类型,运行期不存在泛型。泛型擦除规则:无边界泛型擦除为Object,有边界泛型擦除为对应边界类型。因此运行时无法获取泛型真实类型,也是泛型不能用在静态方法、基本类型的原因。13.序列化和反序列化是什么?transient关键字作用?答案解析:序列化:将Java对象转为字节流,用于网络传输、本地持久化存储;反序列化:将字节流还原为Java对象,是序列化的逆过程。实现方式:类实现Serializable接口即可开启序列化。transient关键字:修饰成员变量,被修饰的变量不会参与序列化,序列化时该变量值会丢失,反序列化后为默认值。常用于屏蔽敏感数据、临时变量。14.数组和集合的区别?答案解析:1.长度特性:数组长度固定,初始化后不可修改;集合长度动态可变,支持增删扩容。2.存储类型:数组可存储基本类型和引用类型;集合只能存储引用类型(基本类型会自动装箱为包装类)。3.功能特性:数组无内置方法,操作繁琐;集合提供增删改查、排序、遍历等丰富工具方法。4.性能:数组内存连续、访问速度更快;集合底层封装复杂,性能略低于数组。使用场景:固定数量数据用数组,动态数量、频繁操作数据用集合。15.什么是Java多态?实现多态的条件?答案解析:多态是面向对象三大特性之一,指父类引用指向子类对象,同一个行为在不同子类中呈现不同实现效果。实现多态的三个必要条件:1.存在继承关系;2.子类重写父类方法;3.父类引用指向子类对象。核心价值:降低代码耦合度,拓展性强,符合开闭原则,新增子类无需修改原有代码。16.break、continue、return的区别?答案解析:break:跳出当前循环或switch语句,终止当前代码块执行,直接结束循环。continue:跳过本次循环剩余代码,直接进入下一次循环,不终止整体循环。return:终止当前方法执行,返回方法结果(有返回值)或直接结束方法(无返回值),循环嵌套中return直接结束整个方法。17.静态变量和实例变量的区别?答案解析:1.修饰符:静态变量用static修饰;实例变量无static修饰。2.存储位置:静态变量存储在方法区;实例变量存储在堆内存对象中。3.生命周期:静态变量随类加载而初始化,随类销毁而销毁,生命周期与程序一致;实例变量随对象创建而存在,对象被GC回收后销毁。4.访问方式:静态变量可通过类名直接访问,也可通过对象访问;实例变量只能通过对象访问。5.共享性:静态变量全局共享,所有对象共用一份;每个对象拥有独立的实例变量,互不干扰。18.接口的默认方法和静态方法特点?答案解析:JDK8新增接口默认方法、静态方法,解决接口升级兼容问题:默认方法:用default修饰,有方法体,实现类可重写也可直接继承,无需强制实现,用于接口新增功能,兼容旧版本实现类。静态方法:用static修饰,有方法体,属于接口本身,只能通过接口名调用,实现类无法继承、无法重写。19.深拷贝和浅拷贝的区别?答案解析:浅拷贝:创建新对象,基本类型复制数值,引用类型仅复制内存地址,新旧对象共享引用类型数据,修改引用数据会互相影响。深拷贝:完全复制整个对象,基本类型复制数值,引用类型重新创建新对象复制数据,新旧对象所有数据完全独立,修改互不影响。开发场景:简单对象用浅拷贝,包含引用类型成员的复杂对象,必须用深拷贝避免数据污染。20.面向对象三大特性及各自作用?答案解析:1.封装:将属性和方法封装在类中,私有化属性,提供公共访问方法,屏蔽内部实现细节,保证数据安全性,降低代码耦合。2.继承:子类继承父类的属性和方法,实现代码复用,减少重复代码,搭建层级化代码结构。3.多态:父类引用指向子类对象,方法动态绑定,提升代码拓展性,符合开闭原则,便于功能迭代升级。第二部分Java集合框架高频面试题(15题)本部分聚焦List、Set、Map核心集合,侧重底层源码、性能对比、并发问题,为面试高频重难点1.ArrayList和LinkedList的区别?适用场景?答案解析:1.底层结构:ArrayList底层是动态扩容数组;LinkedList底层是双向链表。2.访问性能:ArrayList支持随机访问,通过下标查询速度极快;LinkedList无下标,只能从头遍历,查询效率低。3.增删性能:ArrayList中间增删需要移动数组元素,效率低;LinkedList仅修改节点指针,无需移动数据,中间增删效率高。4.内存占用:ArrayList内存连续,存在冗余容量,占用内存少;LinkedList每个节点存储数据和前后指针,内存开销大。场景:大量查询、少量增删用ArrayList;大量增删、少量查询用LinkedList。2.ArrayList的扩容机制?默认初始容量和扩容比例?答案解析:JDK1.8及以上:ArrayList默认初始容量为0,首次添加元素时初始化容量为10;JDK1.7默认初始容量10。扩容规则:当数组元素个数等于当前容量时触发扩容,默认扩容比例为原容量的1.5倍。扩容流程:创建新的大容量数组,将原数组所有元素复制到新数组,废弃原数组,完成扩容。优化建议:提前预估数据量,初始化时指定容量,减少频繁扩容带来的性能损耗。3.HashMap的底层原理?JDK1.7和JDK1.8的区别?答案解析:HashMap底层基于哈希表实现,核心是数组+链表+红黑树,通过哈希算法确定元素存储位置,解决哈希冲突。JDK1.7与JDK1.8核心区别:1.数据结构:1.7仅数组+单向链表;1.8新增红黑树结构,链表长度大于8且数组容量大于64时,链表转为红黑树,查询效率大幅提升。2.插入方式:1.7链表头插法;1.8链表尾插法,解决了多线程下循环链表死循环问题。3.扩容机制:1.7扩容重新计算所有元素哈希位置;1.8优化扩容逻辑,部分元素无需重算哈希,直接原位或偏移迁移。4.初始容量:1.7初始化即创建16容量数组;1.8懒加载,首次put元素才初始化数组。4.HashMap为什么线程不安全?如何解决?答案解析:线程不安全场景:多线程同时put元素会导致数据覆盖、丢失;JDK1.7多线程扩容会产生循环链表,引发死循环CPU飙升;多线程并发扩容、插入会出现哈希冲突错乱。解决方案:1.使用Hashtable:全程加锁,线程安全,但性能极差,全局独占锁,并发阻塞严重。2.使用Collections.synchronizedMap:方法级加锁,性能依旧偏低。3.推荐使用ConcurrentHashMap:分段锁机制(1.7)/CAS+Synchronized锁(1.8),并发性能优异,线程安全。5.ConcurrentHashMap的底层原理?如何保证线程安全?答案解析:JDK1.8核心原理:底层数组+链表+红黑树,采用CAS无锁机制+synchronized局部锁实现线程安全,放弃了1.7的分段锁。安全机制:1.空桶位置插入元素,使用CAS自旋无锁操作,不阻塞线程,效率高。2.桶内已有元素,对当前桶的首节点加synchronized锁,仅锁定单个哈希桶,不影响其他桶并发操作,锁粒度极小。3.结合volatile修饰数组,保证内存可见性,杜绝脏数据。优势:并发度高、阻塞少、性能远超Hashtable,是多线程场景下Map的首选。6.HashSet、TreeSet、LinkedHashSet的区别?答案解析:1.HashSet:底层基于HashMap,无序、不重复,查询存储效率最高,适合快速去重。2.TreeSet:底层基于TreeMap(红黑树),元素自然排序,支持自定义比较器,有序、不重复,效率低于HashSet。3.LinkedHashSet:继承HashSet,底层基于LinkedHashMap,保留元素插入顺序,有序、不重复,性能介于前两者之间。7.HashMap的key和value可以为null吗?为什么?答案解析:HashMap允许key和value为null,且key最多存在一个null值,value可以多个null。原理:key为null时,哈希值固定为0,存储在数组下标0的位置,重复nullkey会覆盖原有数据,因此仅保留一个nullkey。对比:Hashtable的key和value都不允许为null,直接抛出空指针异常。8.哈希冲突的解决方式?HashMap采用哪种?答案解析:常见哈希冲突解决方案:1.开放寻址法:冲突后顺延寻找空位置,ThreadLocalMap采用此方式。2.链地址法(拉链法):冲突元素挂载在同一链表下,HashMap采用此方式。3.再哈希法:冲突后更换哈希算法重新计算下标。HashMap优化:链表长度超过8、数组容量超64时转为红黑树,将链表O(n)查询复杂度优化为红黑树O(logn)。9.为什么HashMap的容量必须是2的幂次方?答案解析:核心目的:优化哈希取模运算,提升效率。普通取模运算%效率低,2的幂次方容量可通过位运算(hash&(cap-1))替代取模,速度大幅提升。同时可以保证哈希分布更均匀,减少哈希冲突,让元素均匀分布在数组各个下标。如果自定义容量非2的幂次方,HashMap会自动向上适配最近的2的幂次方数值。10.List和Set的区别?答案解析:1.有序性:List是有序集合,保留元素插入顺序,可通过下标访问;Set无序(LinkedHashSet除外),无下标。2.重复性:List允许元素重复;Set不允许元素重复,自动去重。3.遍历方式:List支持下标遍历、迭代器遍历;Set仅支持迭代器、增强for遍历。11.LinkedHashMap的特点和使用场景?答案解析:LinkedHashMap继承HashMap,底层维护双向链表,保留元素插入顺序或访问顺序。核心特性:支持LRU(最近最少使用)策略,可重写removeEldestEntry方法实现简易缓存淘汰机制。使用场景:实现本地简易LRU缓存、需要有序存储的键值对数据。12.为什么重写equals必须重写hashCode?答案解析:Java规范规定:两个对象equals相等,hashCode必须相等;但hashCode相等,对象不一定equals相等。如果仅重写equals不重写hashCode,会导致两个内容相同的对象,equals判定相等,但hashCode不同。存入HashMap、HashSet时,会被判定为两个不同对象,造成重复存储,违背去重规则,引发数据错乱。13.集合遍历中为什么不能删除元素?如何安全删除?答案解析:普通for/增强for遍历集合时删除元素,会修改集合modCount修改次数,触发快速失败(fail-fast)机制,抛出ConcurrentModificationException异常。安全删除方式:1.使用迭代器Iterator的remove方法;2.JDK8+使用removeIf过滤删除;3.遍历过程中记录下标,遍历结束后统一删除。14.fail-fast和fail-safe的区别?答案解析:fail-fast(快速失败):普通集合ArrayList、HashMap采用,遍历过程中集合被修改,立即抛出异常,终止遍历,防止数据错乱,非线程安全。fail-safe(安全失败):并发集合CopyOnWriteArrayList采用,遍历的是原集合快照,遍历过程中修改集合不影响遍历,不会抛出异常,牺牲一致性换取并发安全。15.CopyOnWriteArrayList的原理和适用场景?答案解析:底层原理:写时复制,增删改操作不会直接修改原数组,而是复制新数组完成操作,修改完成后替换原数组;读操作直接读取原数组,无锁。特性:读写分离,读无锁、高性能,写操作开销大(复制数组);弱一致性,读取数据可能是旧快照数据。场景:适合读多写少的并发场景(配置查询、字典查询),不适合大量写入场景。第三部分多线程与并发高频面试题(15题)本部分为Java中级核心考点,侧重线程原理、锁机制、并发工具,面试必考重难点1.线程和进程的区别?答案解析:1.定义:进程是操作系统资源分配的最小单位;线程是CPU调度的最小单位,是进程的组成部分。2.资源占用:进程独立占用内存、资源,互不干扰;线程共享进程内的堆内存、方法区资源,仅私有栈内存。3.开销:进程创建、销毁开销极大;线程开销极小,切换速度快。4.独立性:一个进程崩溃不影响其他进程;一个线程崩溃,整个进程直接崩溃。5.并发:进程间并发开销大;线程间并发效率高,是Java并发的核心载体。2.Java线程的生命周期及五种状态?答案解析:Java线程完整生命周期分为五种核心状态:1.新建(NEW):创建线程对象,未调用start()方法。2.就绪(RUNNABLE):调用start(),等待CPU调度,随时可执行。3.运行(RUNNING):获取CPU时间片,执行线程代码。5.终止(TERMINATED):线程代码执行完毕或异常终止,生命周期结束。核心注意:线程只能从新建→就绪,无法重复start(),否则抛出异常。3.start()和run()的区别?答案解析:1.功能不同:start()是开启新线程,由JVM调度执行线程,实现多线程并发;run()只是普通成员方法,直接调用不会开启新线程,同步执行。2.调用次数:start()只能调用一次,多次调用抛出异常;run()可重复调用。3.执行时机:start()执行后线程进入就绪状态,等待CPU调度;run()调用后立即同步执行。4.synchronized和Lock锁的区别?答案解析:1.底层实现:synchronized是JVM原生锁,基于虚拟机指令实现;Lock是Java代码层面的锁,基于AQS队列实现。2.锁特性:synchronized是隐式锁,自动加锁、自动释放,无需手动控制;Lock是显式锁,需要手动lock()加锁、unlock()释放锁。3.锁机制:synchronized是非公平锁,不可中断;Lock可实现公平锁、可中断锁、超时锁。4.条件等待:synchronized只能随机唤醒等待线程;Lock可绑定多个Condition,精准唤醒指定线程。5.性能:低并发下两者性能相近,高并发下Lock锁性能更优。总结:简单同步用synchronized,复杂并发场景(公平锁、精准唤醒、超时锁)用Lock。5.volatile关键字的作用?不能保证原子性的原因?答案解析:volatile核心三大作用:1.保证内存可见性;2.禁止指令重排序;3.不保证原子性。无法保证原子性原因:复合操作(i++、i+=1)是读取、修改、写入三步操作,volatile仅保证单步操作可见,无法锁住三步复合操作,多线程并发时会出现数据覆盖。适用场景:单一变量状态标记、读写分离场景,不适合计数、累加等复合操作场景。6.什么是线程安全?如何保证线程安全?答案解析:线程安全:多线程并发操作共享资源时,不会出现数据错乱、覆盖、丢失,程序运行结果和单线程一致。常用保障方案:1.无共享资源:避免共享变量,从根源杜绝并发问题。2.不可变对象:final修饰变量,数据不可修改,天然线程安全。3.锁机制:synchronized、ReentrantLock保证操作原子性。4.并发工具:Atomic原子类、ConcurrentHashMap等线程安全集合。5.ThreadLocal:线程私有变量,每个线程独立存储,互不干扰。7.ThreadLocal的原理和使用场景?内存泄漏问题?答案解析:原理:每个线程内部维护ThreadLocalMap,以ThreadLocal为key、存储数据为value,数据线程私有,线程隔离。使用场景:存储线程独立上下文、用户登录信息、数据库连接,实现参数全局透传,避免参数层层传递。内存泄漏原因:ThreadLocal是弱引用key,线程长期存活(线程池线程)时,key被回收但value强引用残留,无法GC回收。解决方案:使用完毕后手动调用remove()方法清除数据。8.线程池的核心参数及作用?答案解析:线程池七大核心参数:1.corePoolSize:核心线程数,线程池常驻线程,空闲不销毁。2.maximumPoolSize:最大线程数,线程池允许创建的最大线程总量。3.keepAliveTime:非核心线程空闲超时时间,超时销毁。4.unit:超时时间单位。5.workQueue:任务阻塞队列,存储等待执行的任务。6.threadFactory:线程工厂,创建线程,可自定义线程名称、优先级。7.handler:拒绝策略,任务超出线程池承载能力时的处理规则。核心执行流程:任务提交→核心线程执行→队列排队→创建非核心线程→触发拒绝策略。9.四种线程池的特点?为什么禁止使用Executors?答案解析:1.newFixedThreadPool:固定线程数,无核心非核心区分,队列无界,任务堆积易OOM。2.newCachedThreadPool:无核心线程,最大线程数无限,高并发下创建大量线程,耗尽CPU资源。3.newSingleThreadExecutor:单线程执行,队列无界,任务堆积易OOM。4.newScheduledThreadPool:定时任务线程池,最大线程数无限,高并发线程爆炸。禁止原因:Executors封装的线程池存在无界队列、无限线程数问题,线上高并发场景极易引发内存溢出、CPU飙升,生产环境必须手动自定义ThreadPoolExecutor。10.线程池拒绝策略有哪些?答案解析:JDK默认四种拒绝策略:1.AbortPolicy(默认):直接抛出任务拒绝异常,终止任务提交。2.CallerRunsPolicy:由提交任务的主线程自行执行任务,不丢弃、不报错。3.DiscardPolicy:静默丢弃新任务,不报错、不执行。4.DiscardOldestPolicy:丢弃队列中最旧的未执行任务,替换为新任务。生产场景可自定义拒绝策略,实现任务降级、日志记录、重试机制。11.sleep()和wait()的区别?答案解析:1.所属类:sleep()是Thread类静态方法;wait()是Object类方法。2.锁机制:sleep()不释放锁资源;wait()执行后立即释放锁。3.唤醒方式:sleep()超时自动唤醒;wait()需要手动notify()/notifyAll()唤醒。4.适用场景:sleep()用于线程休眠;wait()用于多线程通信、锁等待场景。12.什么是死锁?产生死锁的四个必要条件?如何避免?答案解析:死锁:多个线程互相持有对方需要的锁资源,互相等待释放,无限阻塞,程序卡死。四大必要条件(缺一不可):互斥条件、请求与保持条件、不可剥夺条件、循环等待条件。避免方案:破坏循环等待条件(统一锁获取顺序)、设置锁超时时间、使用tryLock尝试加锁、减少嵌套锁。13.CAS原理及优缺点?ABA问题如何解决?答案解析:CAS(无锁比较交换):包含三个参数(内存值、旧预期值、新值),内存值等于旧值则更新为新值,否则不更新,循环重试。优点:无锁操作,不阻塞线程,并发性能高。缺点:自旋重试消耗CPU、存在ABA问题、只能保证单个变量原子性。ABA问题:变量从A→B→A,CAS判定无变化,实际已被修改。解决方案:使用带版本号的AtomicStampedReference,通过版本号记录修改次数,杜绝ABA问题。14.AQS的核心原理?答案解析:AQS(抽象队列同步器)是Java并发包的核心底层框架,Lock、CountDownLatch、Semaphore均基于AQS实现。核心原理:基于volatile修饰的state状态变量+FIFO双向队列,通过CAS修改state值实现锁抢占,抢占失败的线程进入队列阻塞排队,释放锁后唤醒队列线程。核心模式:独占锁(ReentrantLock)、共享锁(读写锁、计数器)。15.常用并发工具类及场景?答
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中小学教师高级职称专业水平能力题库及答案
- 2026年低压电工证理论全国考试题库(含答案)
- 2026年全国安全生产月安全知识培训考试题库及答案
- 耳聋基因检测与听力康复
- 医院医疗废物收集礼仪
- 西北民族大学口腔医学本科专业培养方案
- 《老年护理学》课件老年病人的康复护理人卫
- 爱家庭主题课件
- 安全生产日常点检指南讲解
- 消防安全工作重点强调
- 《运动技能学习与控制》考试复习题库(含答案)
- 露天采矿技术管理
- 内部控制评价与审计案例研究-11-24
- (最准确)工程勘察设计收费标准快速计算表(EXCEL)
- 第2章 CR400AF动车组司机室设备操作《复兴号动车组司机操作及整备》教学课件
- 金融实习证明
- GB/T 11137-1989深色石油产品运动粘度测定法(逆流法)和动力粘度计算法
- 第11讲 接触网平面布置
- GA/T 2000.156-2016公安信息代码第156部分:常用证件代码
- 09S304 卫生设备安装图集
- SMT生产线的检测设备介绍课件
评论
0/150
提交评论