一、说一下==与equals()的区别?(华为后端)
一句话总结:
==比较的是对象内存地址是否相同,适用于基本数据类型和对象引用比较。
equals()用于对象内容比较,默认实现等同于==,但常被重写(如String类)。
String等包装类重写equals()后比较实际值而非地址。
基本类型只能用==比较数值,对象类型需根据需求选择比较方式。
正确使用时应确保equals()方法被目标类正确实现。
核心原则:
1)基本类型(int,char等)用==比较值。
2)引用类型:
1.若需要判断是否为同一对象->==。
2.若需要判断内容是否相等->重写equals(),并确保同步重写hashCode()。
3)包装类和字符串优先使用equals()比较内容。
二、如何创建线程池?线程池常见参数有哪些?(华为后端、美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端)
一句话总结:
创建线程池可通过Java的ThreadPoolExecutor构造函数或Executors工具类实现。核心参数包括:核心线程数(维持常驻线程),最大线程数(扩容上限)、存活时间(非核心线程空闲时长)、任务队列(存放待执行任务)、拒绝策略(队列满时的处理方式)。
三、ThreadLocal 的用法和实现原理?(华为后端、小红书后端)
一句话总结:
ThreadLocal用于存储线程私有数据,通过set()/get()在当前线程内共享变量,每个ThreadLocal内部维护ThreadLocalMap,以ThreadLocal实例为键存储独立副本,数据隔离通过线程专属的Map实现,避免多线程竞争。需注意使用后及时remove()防止内存泄露,弱引用键设计可辅助垃圾回收。
四、说说你了解的JVM内存模型?(华为后端、美团后端、小红书后端、京东后端、华为开发岗、阿里巴巴后端、快手后端、小米后端)
一句话总结:
JVM内存模型主要包含堆(存放对象实例)、方法区(存储类信息、常量)、虚拟机栈(线程私有方法调用)、本地方法栈(Native方法)和程序计数器(线程执行位置)。堆和方法区线程共享。栈和程序计数器线程私有,直接内存通过堆外分配管理。
补充:JVM结构
JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。
1)类加载子系统:可以根据指定的全限定名来载入类或接口。
2)执行引擎:负责执行那些包含在被载入类的方法中的指令。
3)运行时数据区:分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。
当程序运行时,JVM需要内存来存储诸多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果等,把这些东西存储到运行时数据区中,以便于管理。
五、说说JVM的垃圾回收算法?(华为后端、美团后端、字节跳动后端、小红书后端、京东后端、腾讯后端、滴滴后端、快手后端、小米后端、百度后端)
一句话总结:
JVM垃圾回收算法主要包括:标记-清除(产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)。现代JVM多采用分代收集策略,结合不同算法管理新生代(复制)和老年代(标记-清除/整理)。还有增量、并发算法(如G1)减少停顿时间。
六、说说你对IoC的理解?(华为后端)
一句话总结:
IoC(控制反转)是一种设计原则,将对象创建和依赖管理的控制权从程序转移到外部容器,降低代码耦合。核心思想是“依赖由外部注入而非主动创建”,常见方式为依赖注入(DI)。通过容器统一管理对象生命周期,提升代码灵活性和可维护性,使组件更易测试和扩展。
七、说说你对AOP的理解?(华为后端、小红书后端、京东后端、华为开发岗)
一句话总结:
AOP(面向切面编程)通过横向抽取共性功能(如日志、事务),解决代码重复和耦合问题。以动态代理机制在目标方法前后织入增强逻辑,核心概念包括切点(where)、通知(what)、切面(where+what)。实现了业务逻辑与横切关注点分离,提升代码复用性和可维护性。
八、JDK动态代理是什么?和cglib区别?(华为后端、小米后端)
一句话总结:
JDK动态代理是Java基于接口实现的代理技术,通过反射机制在运行时生成代理类。
与CGLib的区别:
1)JDK需实现接口,CGLib通过继承直接代理普通类;
2)JDK无需第三方库,CGLib需引入ASM包;
3)CGLib无法代理final类/方法,JDK无法代理无接口类;
4)CGLib生成代理类性能通常更高。
九、如何评估 / 判断索引是否生效?常见索引失效场景有哪些?(华为后端、字节跳动后端、京东后端、滴滴后端、小米后端)
一句话总结:
评估索引是否失效需要”三看“:看执行计划是否命中索引(EXPLAIN)、看扫描行数是否骤降(rows)、看查询耗时是否锐减(性能监控);失效常因”破坏索引结构“或”优化器弃用“(如函数计算、隐式转换、前导通配符等)。
十、什么是主从同步?MySQL 如何实现?(华为后端)
一句话总结:
主从同步是指在数据库中将主库的数据复制到从库,以实现数据冗余和负载均衡,MySQL通过二进制日志(binlog)和复制线程实现这一过程。
十一、请你说说HashMap底层原理和扩容机制?(美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、快手后端、小米后端、百度后端)
一句话总结:
HashMap底层采用数组+链表/红黑树结构,通过哈希算法确定元素存储位置。默认初始容量16,负载因子0.75,当元素数量超过(容量x负载因子)时触发扩容。扩容时创建双倍容量新数组,通过高位运算重新计算节点位置(JDK8优化为无需重新hash),原数据通过尾插法迁移到新数组,链表长度超过8且数组长度≥64时会转为红黑树,提升查询效率。
十二、详细的说说Redis的数据类型?(美团后端、字节跳动后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、百度后端)
一句话总结:
Redis核心数据类型包括:
1)String:存储文本、数字或二进制数据。
2)List:双向链表,支持队列和栈操作。
3)Hash:字段-值映射,适合存储对象。
4)Set:无序唯一集合,支持交并差运算。
5)Sorted Set:按分数排序的有序集合。扩展类型含Bitmaps、HyperLogLog、地理空间及Stream(消息队列)。
十三、说说Redis的持久化策略?(美团后端、字节跳动后端、腾讯后端、阿里巴巴后端、滴滴后端、百度后端)
一句话总结:
Redis提供两种持久化策略:RDB(快照)和AOF(追加日志)。RDB通过定时生成数据快照实现,适合快速恢复但可能丢失部分数据;AOF记录所有写操作命令,数据完整性更高但文件较大。此外,Redis支持混合持久化模式(AOF+RDB),结合两者优势实现高效备份与恢复。
十四、Redis如何与数据库保持双写一致性?(美团后端、字节跳动后端、京东后端、腾讯后端、快手后端、百度后端)
一句话总结:
为确保Redis与数据库双写一致性,常用方法包括:先更新数据库再删缓存(Cache-Aside)、延迟双删(更新前后均删除缓存并延迟二次删除)、基于消息队列异步同步、监听数据库binlog触发缓存更新,以及设置缓存过期时间兜底,需结合业务场景选择策略,配合重试机制确保最终一致性。
十五、从「敲下一个 URL」到「页面出现在屏幕」整条链路全景?(美团后端、字节跳动后端、小红书后端、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端)
一句话总结:
“敲下URL->解析地址->DNS找人->(TCP/QUIC+TLS)打通线路->发HTTP请求->服务器回资源->浏览器边下边渲染->四次挥手收尾”。
十六、HTTP vs. HTTPS 有什么区别?(美团后端、字节跳动后端、腾讯后端、滴滴后端、快手后端、百度后端)
一句话总结:
HTTP想明信片——谁都能偷看;HTTPS像贴好身份证、加密又防篡改的快递箱,既保证内容机密,也验证“寄件人”身份。
十七、HTTPS 的「秘钥交换 + 证书校验」全流程?(字节跳动后端、腾讯后端)
一句话总结:
HTTPS通过「证书像身份证、密钥交换像一次临时暗号本的当面约定」的握手流程,实现了“我是谁+对话只让你看”双重保障。
十八、TCP 与 UDP 的 10 大核心区别是什么?(美团后端、字节跳动后端、小红书后端、腾讯后端、滴滴后端、快手后端、小米后端、百度后端)
1)连接方式:
TCP:面向连接,需通过三次握手建立连接,传输结束后通过四次挥手释放连接。
UDP:无连接,直接发送数据,无需预先建立连接。
2)可靠性:
TCP:可靠传输,通过确认应答(ACK)、超时重传、丢包重发等机制保证数据完整有序。
UDP:不可靠传输,不保证数据是否到达或顺序正确。
3)数据顺序:
TCP:通过序列号和确认机制保证数据按发送顺序到达。
UDP:不保证顺序,即使数据乱序到达也不会重新排序。
4)流量控制:
TCP:通过滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出。
UDP:无流量控制,可能因发送过快导致丢包。
5)拥塞控制:
TCP:通过慢启动、拥塞避免等算法(如Reno、CUBIC)避免网络拥堵。
UDP:无拥塞控制,可能加剧网络拥堵。
6)传输效率:
TCP:因连接管理、重传等机制,头部开销大(20字节以上),传输效率较低。
UDP:头部仅8字节,无额外控制机制,传输效率高。
7)数据边界:
TCP:基于字节流,无明确消息边界,需应用层自行处理(如添加分隔符)。
UDP:保留数据报边界,每次发送/接收均为独立报文。
8)多播/广播支持
TCP:仅支持单播(一对一通信)。
UDP:支持单播、多播(一对多)和广播(一对所有)。
9)适用场景:
TCP:要求可靠传输的场景(如网页浏览、文件传输、电子邮件)。
UDP:实时性优先的场景(如视频流、语音通话、在线游戏、DNS查询)。
10)首部大小:
TCP:首部至少20字节(包含选项字段可更长)。
UDP:固定8字节首部(源端口、目的端口、长度、校验和)。
十九、说说 TCP 的三次握手?(美团后端、字节跳动后端、华为开发岗、腾讯后端、滴滴后端、快手后端、小米后端、百度后端)
一句话总结:
三次握手=“我能发->你能收->我知道你能收”,两次握手保证不了双方都确认通路可用,而四次又可把“确认+发起”合并成一次包,因此恰好三次最经济;若任意报文丢失或主机发完SYN就宕机,TCP都靠超时重传+半开连接清理机制自动收场。
二十、TCP 协议如何保证可靠传输?(字节跳动后端、小红书后端、腾讯后端)
一句话总结:
TCP通过给每个字节编号、累积确认与超时重传、滑动窗口流量控制、校验和检测以及拥塞控制等协同机制,实现端到端的可靠传输。
二十一、Redis中的Zset怎么实现的?(字节跳动后端、小米后端)
一句话总结:Redis的Zset通过跳跃表现和哈希表实现,哈希表存储成员到分数的映射以支持快速查询,跳跃表按分数排序成员以支持高效的范围操作。两者结合确保插入、删除和查询的时间复杂度为O(log n)。数据量小时可能使用压缩列表优化内存。
二十二、消息队列如何保证消息不丢?(字节跳动后端、阿里巴巴后端、滴滴后端)
一句话总结:
消息队列通过多环节保障机制防止消息丢失:生产者使用确认机制(如ACK)确保消息成功发送至Broker;Broker采用持久化存储(如磁盘写入)和副本同步防止数据丢失;消费者处理成功后手动提交确认,失败时触发重试;消息重试机制和死信队列处理异常情况;整体通过事务机制或者幂等设计保证端到端一致性。
二十三、什么是进程和线程?进程和线程的区别?(美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端)
一句话总结:
进程是操作系统中资源分配的基本单位,线程是进程中执行的基本单位,进程拥有独立的内存空间,而线程共享进程的内存空间和资源。
进程是操作系统分配资源的最小单位,线程是CPU调度的最小执行单元。关键区别有两点:
1)线程共享进程资源(通信高效),进程资源独立;
2)线程创建/切换开销远小于进程;
二十四、进程间通信方式有哪些?(字节跳动后端、腾讯后端、快手后端、百度后端)
一句话总结:
进程间通信(IPC)方式包括管道、消息队列、共享内存、信号量、套接字和信号等,每种方式在不同场景下具有独特的优势和适用性。
二十五、为什么 MySQL 采用 B+ 树作为索引?(美团后端、字节跳动后端、小红书后端、京东后端、腾讯后端、快手后端、百度后端)
一句话总结:
MySQL采用B+树作为索引,因为它支持高效的范围查询、顺序访问和磁盘读写优化。B+树的叶子节点链表结构支持顺序访问和范围查询,树的高度较低,减少了磁盘I/O次数,适合处理大规模数据集,且能够有效支持等值查询和范围查询。
二十六、如何监控并优化慢 SQL?(美团后端、字节跳动后端、京东后端、腾讯后端、滴滴后端、快手后端、百度后端)
一句话总结:
监控并优化慢SQL可以通过启用慢查询日志、分析查询计划、优化索引和调整查询结构等方法实现。
二十七、事务隔离级别有哪些?(美团后端、字节跳动后端、京东后端、华为开发岗、腾讯后端)
一句话总结:
MySQL提供四种事务隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read,MySQL默认)和串行化(Serializable),它们从低到高一次增强数据一致性,但并发性能递减。
二十八、请你说说ArrayList和LinkedList的区别?(美团后端、小红书后端、华为开发岗、腾讯后端、小米后端)
一句话总结:
ArrayList基于动态数组实现,随机访问快(O(1)),但增删元素需移动数据(O(n));LinkedList基于双向链表实现,增删元素快(O(1)),但随机访问需遍历(O(n))。ArrayList内存连续但可能预留空间,LinkedList每个节点含前后指针更占内存。线程均不安全,适用场景取决于读写操作比例。
二十九、说说缓存穿透、击穿、雪崩的区别?(美团后端、小红书后端、京东后端)
一句话总结:
缓存穿透是查询不存在的数据绕过缓存击穿数据库;缓存击穿是热点数据过期导致瞬间高并发请求压垮数据库;缓存雪崩是大量缓存同时失效引发数据库连锁崩溃。区别在于穿透因数据不存在,击穿因单点热点失效,雪崩因大规模缓存失效。
三十、讲一下乐观锁和悲观锁?(美团后端、阿里巴巴后端)
一句话总结:
乐观锁假设操作冲突少,只在提交时检查数据是否被修改(如版本号机制),适用于读多写少场景。悲观锁预先加锁(如行锁,表锁),确保独占操作,适合写多场景,但影响并发性能,前者减少锁竞争,后者保证强一致性。
三十一、HTTP 常见状态码有哪些?(美团后端、百度后端)
HTTP状态码分为五大类,核心按请求结果划分:
2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误,1xx很少用。
高频的比如200(请求成功带数据)、204(成功无数据);
301永久重定向(域名迁移)、302临时重定向(未登录跳登录)、304用缓存;
400参数错误、401未登录、403无权限、404资源不存在;
500服务端bug、502网关收无效相应(如后端崩了)、504网关超时(后端处理慢)。
开发中查问题先看状态码:4xx查客户端,5xx查服务端。
三十二、联合索引的存储结构与最左前缀原则?(美团后端、小红书后端)
一句话总结:
联合索引的存储结构是将多个列的值组合在一起形成一个复合键,按照字典序进行排序存储。
最左前缀原则指的是在使用联合索引时,查询条件必须从索引的最左列开始,才能有效利用索引进行加速查询。
只有满足最左前缀的查询条件,才能充分发挥联合索引的性能优势。
三十三、说说synchronize的用法及原理?(小红书后端、快手后端、小米后端)
一句话总结:
synchronized用于控制多线程对共享资源的访问,可修饰方法或代码块,通过指定锁对象实现互斥,通过指定锁对象实现互斥。其原理基于对象内部的监控器锁(Monitor),线程进入时获取锁,退出时释放锁,底层依赖操作系统的互斥锁及内存屏障机制保证原子性与可见性,JVM会优化锁状态(偏向锁,轻量级锁等)提升性能。
三十四、说说类加载机制?(小红书后端、快手后端)
一句话总结:
类加载机制是JVM动态加载类的过程,包含加载、验证、准备、解析和初始化五个阶段。加载阶段读取.class文件生成Class对象;验证确保字节码合法;准备为静态变量分配内存并赋默认值;解析将符号引用转为直接引用;初始化执行静态代码块和变量赋值。各阶段顺序执行,确保类正确加载且符合安全规范。
三十五、说说Bean的生命周期?(小红书后端)
一句话总结:
Bean的生命周期分为:实例化(构造函数)->属性注入(依赖注入)->初始化(执行Aware接口、BeanPostProcessor前置处理、@PostConstruct、InitializingBean、自定义init方法)->使用阶段->销毁(@PreDestory、DisposableBean接口或自定义destroy方法)。容器通过回调机制在各阶段执行特定扩展点。
三十六、介绍一下Redis的集群模式?(小红书后端)
一句话总结:
Redis集群模式(Cluster Mode)是一种分布式解决方案,通过分片(16384个哈希槽)将数据分散到多个节点,支持自动数据迁移和故障转移。每个节点可为主从结构,主节点处理读写,从节点备份并在主节点故障时接替,实现高可用。客户端通过重定向机制访问数据,无需代理,支持横向扩展与容错。
三十七、讲一下限流算法?(小红书后端、滴滴后端)
一句话总结:
限流算法用于控制系统的请求处理速率,常见方法包括:1.计数器算法(固定时间窗口限制请求数,存在临界突变问题);2.滑动窗口算法(细化时间粒度,平滑流量控制);3.漏桶算法(以恒定速率处理请求,缓冲突发流量);4.令牌桶算法(定期生成令牌,允许短时突发通过);5.自适应算法(根据系统负载动态调整阈值,如TCP拥塞控制)。
三十八、redo log / undo log / binlog 各自作用?(小红书后端、京东后端)
一句话总结:
redo log用于数据恢复,undo log用于事务回滚,binlog用于数据复制和恢复,三者在MySQL中各司其职,确保数据一致性和持久性。
三十九、synchronized和Lock有什么区别?(京东后端)
一句话总结:
1.机制:synchronized是Java关键字,基于JVM实现自动锁管理;Lock是接口,需手动加锁解锁。
2.灵活性:Lock支持非阻塞尝试锁(tryLock)、可中断锁、超时锁,synchronized无法实现。
3.公平性:Lock可设置公平、非公平策略,synchronized仅支持非公平锁。
4.条件变量:Lock可通过Condition绑定多个条件,synchronized仅一个等待队列。
5.性能:高并发时Lock更高效,synchronized优化后差距缩小,但Lock需显式释放避免死锁。
四十、说说你对AQS的理解?(京东后端)
一句话总结:
AQS(AbstractQueuedSynchronized)是Java并发包的核心同步框架,通过内置的FIFO队列管理线程竞争,使用volatile变量state表示同步状态。它提供独占和共享两种模式,子类只需重写tryAcquire/tryRelease等模板方法即可实现锁、信号等同步器(如ReentrantLock/Semaphore),解决了同步控制中线程排队与唤醒的底层细节问题。
四十一、说说Spring事务管理?(京东后端)
一句话总结:
Spring事务管理提供声明式与编程式两种方式,通过@Transactional注解或XML配置简化事务控制,支持事务传播行为、隔离级别及回滚规则。底层基于事务管理器(如DataSourceTransactionManager)统一接口,兼容不同持久层技术,确保数据一致性和原子性。
四十二、说说Redis的缓存淘汰策略?(京东后端)
一句话总结:
Redis提供多种缓存淘汰策略,包括:volatile-lru(针对过期键的LRU淘汰)、allkeys-lru(全体键LRU)、volatile-lfu(过期键LFU)、allkeys-lfu(全体键LFU)、volatile-ttl(优先淘汰剩余时间短的键)、volatile-random/allkeys-random(随机淘汰),以及默认的noeviction(禁止写入)。策略根据内存上限自动触发,用于管理内存不足时的数据清理。
四十三、SQL 调优常见方法有哪些?(京东后端、华为开发岗、阿里巴巴后端、滴滴后端、百度后端)
一句话总结:
SQL调优常见方法包括索引优化、查询重构、使用缓存、减少锁定和优化数据库配置等。
四十四、MySQL 中的 MVCC 是什么?Read View 在 MVCC 中如何工作?如果没有 MVCC 会怎样?(京东后端、滴滴后端、小米后端)
一句话总结:
MySQL的MVCC(多版本并发控制)是通过数据版本链和Read View机制实现非阻塞读的高并发方案;Read View是MVCC的核心组件,决定事务能看到哪些数据版本;没有MVCC将导致读写冲突加剧、性能骤降、死锁频发。
四十五、String、StringBuffer、Stringbuilder有什么区别?(华为开发岗)
一句话总结:
String不可变,每次修改生成新对象;StringBuffer和StringBuilder可变。StringBuffer线程安全但性能较低,StringBuilder非线程安全但效率更高。单线程用StringBuilder,多线程用StringBuffer,少量操作用String。
四十六、说说线程的创建方式?(华为开发岗)
一句话总结:
1.继承Thread类并重写run方法。
2.实现Runnable接口并实现run方法。
3.使用Cailable接口配合FutureTask实现带返回值的线程。
4.通过线程池(如Executor框架)创建管理线程。
5.使用Lambda表达式或匿名内部类简化线程实现。
四十七、说一下Java中的深拷贝、浅拷贝、引用拷贝?(华为开发岗)
一句话总结:
引用拷贝:复制对象引用地址,新旧变量指向同一对象。
浅拷贝:创建新对象,复制基本类型值,引用类型仍指向原对象。
深拷贝:完全复制对象及关联的所有子对象,新旧对象完全独立。
实现方式:浅拷贝常用clone()方法(需重写),深拷贝需递归复制或序列化实现。
核心区别:深拷贝隔离数据修改,浅拷贝和引用拷贝存在数据关联性。
四十八、指针和引用的区别是什么?(华为开发岗)
一句话总结:
指针是一个存储地址的变量,可以指向不同对象,也可以为空(nullptr)。
引用是某个对象的别名,定义时必须初始化且之后不可修改,始终指向同一个对象。
四十九、HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP/3.0 的区别?(腾讯后端、滴滴后端)
1.HTTP/1.0与HTTP/2.0的区别
一句话总结:
HTTP/1.0是”单车道、纯文字“的老国道;HTTP/2.0则是”多车道、全双工、二进制“的高速公路。
2.HTTP/2.0与HTTP/3.0的区别
一句话总结:
HTTP/2.0是”跑在TCP上的多股车道高速“;HTTP/3.0把底层换成QUIC(UDP),”修了一条能换轮胎、永不堵车的新高铁“。
3.HTTP/1.1与HTTP/2.0的区别
一句话总结:
HTTP/1.1是”一根水管+排队取水“;HTTP/2.0把水管加粗成”多股细流并发+加压泵+伺服阀“。
总结口诀:
1.1->2.0:文本变二进制、串行变并行、重复首部变压缩、客户端请求变”可被推送“。
2.0->3.0:TCP变QUIC、握手更快、丢包隔离、连接可迁移。
0->1->2->3就像”修国道->加车道->上高速->换高铁“。
五十、如何在 UDP 之上实现可靠传输?(腾讯后端、阿里巴巴后端)
一句话总结:
在UDP之上实现可靠传输,需要自行引入分段与序号、校验和、确认与重传、超时重传、流量/拥塞控制等机制,模拟TCP的可靠特性。
五十一、说说volatile的用法及原理?(阿里巴巴后端)
1、volatile是一个Java的关键字,用来解决内存可见性问题的。
2、当多个线程操作共享变量时,会存在数据不一致的问题。因为在Java内存模型中,有工作内存和主内存,每个线程都有自己的工作内存,里边存储变量的副本,当对一个普通变量进行写操作时,不会立即同步到主内存,因此其他线程不能立即看到最新的值,这就是内存可见性问题。
3、通过volatile关键字修饰的变量可以解决这个问题,JVM底层是通过内存屏障来实现,当对一个变量进行读取时,插入读屏障,表示先从主内存读取,当对一个变量进行写入后,插入写屏障表示立即同步到主内存,这样就解决了可见性问题,保证了数据一致性,对应于硬件层面,看到资料说是Intel提供了缓存一致性协议MESI,对共享变量写入时,发出通知让其他CPU核心缓存行失败,早期的CPU是通过对总线加锁的方式实现。
4、但volatile不能解决原子性问题,因为每个线程都有工作内存,各自线程计算完后同步到主内存会存在覆盖的问题。
5、volatile的使用场景一般应用在于一个线程读,另一个线程写的情况下,例如标志位这类,同时读写一个volatile的场景不适合,因为会出现原子性问题。
五十二、讲一下Java里的CAS?(阿里巴巴后端、快手后端)
一句话总结:
CAS(Compare-And-Swap)是Java中基于硬件的无锁并发机制,通过比较内存值与预期值进行原子更新。核心方法包含内存地址、预期值和新值,若匹配则更新,否则重试或放弃。常用于AtomicInteger等原子类实现线程安全操作,避免加锁开销。存在ABA问题(可通过版本号标记解决),适用于低竞争场景。
五十三、介绍下双亲委派模型,如何打破它?(阿里巴巴后端、小米后端)
一句话总结:
双亲委派模型是Java类加载机制,子类加载器先委托父类加载器尝试加载类,避免重复加载并保证核心类安全,打破方式包括:1.重写ClassLoader的loadClass()方法,自定义加载逻辑;2.使用线程上下文类加载器,强制指定类加载器层级;3.SPI等场景通过反向委托(如JDBC驱动加载)绕过默认机制。
五十四、消息队列如何保证顺序消费?(阿里巴巴后端)
一句话总结:
消息队列通过生产者按顺序发送至同一分区/队列,消费者单线程顺序处理实现。需确保同一业务标识的消息路由到相同分区,并限制分区仅被一个消费者消费。部分中间件支持全局顺序或局部顺序控制。同时需处理异常重试机制防止乱序。
五十五、消息队列如何保证不重复消费?(阿里巴巴后端、滴滴后端)
一句话总结:
消息队列通过以下机制避免重复消费:1.生产者端添加唯一消息ID实现发送幂等性;2。消息队列服务端支持Exactly-Once语义(如Kafka事务消息);3.消费者端采用去重机制(如数据库唯一索引、Redis原子操作记录已消费ID);4.业务逻辑设计幂等处理(如状态检查、乐观锁);5.正确维护消费位移、确保异常后能从正确位置恢复。
五十六、建索引时需注意哪些事项?(阿里巴巴后端、快手后端、小米后端)
一句话总结:
建索引时需注意以下事项:首先,选择合适的列进行索引,优先考虑经常用于查询条件、排序和连续的列;其次,避免在频繁更新的列上建立索引,以减少维护开销;此外,控制索引的数量,过多的索引会影响写入性能;同时,注意索引的选择性,选择性高的索引能更有效地过滤数据;最后,定期分析和优化索引,以适应数据和查询模式的变化。
五十七、大表(千万级)查询 / 维护该怎么办?(阿里巴巴后端)
一句话总结:
处理千万级大表的查询和维护需要通过索引优化、分区、分表、批量操作和数据库配置调整等方法来提高性能和可维护性。
五十八、深度分页、读写分离、分库分表后 SQL 该如何优化?(阿里巴巴后端)
一句话总结:
在深度分页、读写分离和分库分表的场景下,SQL优化可通过使用索引、限制数据扫描、合理设计查询和缓存策略来提高性能。
五十九、如何利用Redis实现一个分布式锁?(滴滴后端)
一句话总结:
使用Redis的SET命令配合NX(不存在时设置)、EX(过期时间)参数创建唯一键作为锁,并生成随机值标识客户端。获取锁失败时重试或退出,业务处理完成后校验随机值并用Lua脚本原子化删除键释放锁。需注意设置合理超时时间防止死锁,高可用场景可采用RedLock算法增强可靠性。
六十、分布式锁的原理和常见的实现有哪些?(滴滴后端)
一句话总结:
分布式锁通过在共享存储系统中维护互斥状态,确保多个节点间资源访问的排他性。常见实现包括:1.基于数据库(如唯一约束、乐观锁);2.Redis(SETNX命令或RedLock算法);3.ZooKeeper(临时有序节点+Watcher监听);4.Etcd(基于Raft协议的事务与租约机制)。不同方案在性能、一致性和复杂度上各有取舍。
六十一、讲一下防抖节流以及适用场景?(滴滴后端)
一句话总结:
防抖:事件触发后延迟执行,若重复触发则重置延迟。适用场景:搜索框输入联想、窗口resize监听。
节流:固定时间间隔内仅执行一次,稀释触发频率。适用场景:滚动加载、高频按钮防重复点击。
核心区别:防抖合并多次为一次,节流均匀控制执行频率。
六十二、ConcurrentHashMap 线程安全的具体实现方式?(快手后端、小米后端)
一句话总结:
ConcurrentHashMap通过分段锁+CAS机制实现线程安全:1.JDK7采用Segment分段锁,不同段可并发操作;2.JDK8改为Node数组+链表/红黑树,使用synchronized锁单个桶节点;3.volatile保证变量可见性;4.CAS实现无锁化原子操作;5.扩容时多线程协同迁移数据。
六十三、什么是 LRU 算法?(快手后端)
一句话总结:
LRU(Least Recently Used)算法是一种缓存/页面置换策略:始终优先淘汰“最后一次被访问时间最久远”的那一项,用时间局部性原则来最大化命中率。
六十四、说说Redis的大key,为什么会产生大key?(小米后端)
一句话总结:
Redis大Key指存储超大值(如字符串过大、集合元素过多)的键。
主要成因包括:
1.设计不合理,未拆分数据结构;
2.业务需求(如缓存整页数据);
3.数据持续积累未清理;
4.使用不当的集合类型(如无序存储海量数据)。
大Key易引发内存不均、操作阻塞等问题。
六十五、GET 与 POST 有什么区别?(百度后端)
一句话总结:
GET=“只拿不改”;POST=“提交或创建”。二者在语义、幂等性、缓存、参数位置、安全性等方面都有官方规定,也有“江湖惯例”。
六十六、什么是数据库事务?(百度后端)
一句话总结:
数据库事务是由一组不可分割的数据库操作序列组成的逻辑单元,确保操作要么全部成功(提交),要么全部失败(回滚),以维护数据的完整性和一致性。
ACID特性(原子性、一致性、隔离性、持久性)
六十七、