Java 并发库中提供了哪些线程池实现?它们有什么区别?回答重点Java 并发库中提供了 5 种常见的线程池实现,主要通过 Executors 工具类来创建。
1)FixedThreadPool:创建一个固定数量的线程池。
线程池中的线程数是固定的,空闲的线程会被复用。如果所有线程都在忙,则新任务会放入队列中等待。
适合负载稳定的场景,任务数量确定且不需要动态调整线程数。
2)CachedT...
如何合理地设置 Java 线程池的线程数?回答重点线程池的线程数设置需要看具体执行的任务是什么类型的。
任务类型可以分:CPU 密集型任务和 I/O 密集型任务。
CPU 密集型任务CPU 密集型任务,就好比单纯的数学计算任务,它不会涉及 I/O 操作,也就是说它可以充分利用 CPU 资源(如果涉及 I/O,在进行 I/O 的时候 CPU 是空闲的),...
如何在 Java 中控制多个线程的执行顺序?回答重点在 Java 中控制多个线程的执行顺序有很多种方法:
1) CompletableFuture,它内部有 thenRun 的方法,假设我们现在有三个任务T1、T2、T3 需要按序执行,那么仅需使用以下伪代码即可:
123CompletableFuture.runAsync(() -> {do t1 sth}) ...
Synchronized 和 ReentrantLock 有什么区别?回答重点Synchronized 是 Java 内置的关键字,实现基本的同步机制,不支持超时,非公平,不可中断,不支持多条件。
ReentrantLock 是 JUC 类库提供的,由 JDK 1.5 引入,支持设置超时时间,可以避免死锁,比较灵活,并且支持公平锁,可中断,支持多条件判断。
ReentrantLock 需要手...
说说 AQS 吧?回答重点
如果面试官问你为什么需要 AQS ,不要长篇大论,容易把自己和面试官绕进去。就这样简要的回答:
简单来说 AQS 就是起到了一个抽象、封装的作用,将一些排队、入队、加锁、中断等方法提供出来,便于其他相关 JUC 锁的使用,具体加锁时机、入队时机等都需要实现类自己控制。
它主要通过维护一个共享状态(state)和一个先进先出(FIFO)的等待队列,来管理线程对共...
什么是 Java 的 CAS(Compare-And-Swap)操作?回答重点CAS 是一种硬件级别的原子操作,它比较内存中的某个值是否为预期值,如果是,则更新为新值,否则不做修改。
工作原理:
比较(Compare):CAS 会检查内存中的某个值是否与预期值相等。
交换(Swap):如果相等,则将内存中的值更新为新值。
失败重试:如果不相等,说明有其他线程已经修改了该值,CAS 操作失败...
什么是 Java 中的原子性、可见性和有序性?回答重点1)原子性(Atomicity):
原子性指的是一个操作或一系列操作要么全部执行成功,要么全部不执行,期间不会被其他线程干扰。
2)可见性(Visibility):
可见性指的是当一个线程修改了某个共享变量的值,其他线程能够立即看到这个修改。
3)有序性(Ordering):
有序性指的是程序执行的顺序和代码的先后顺序一致。但在多线程环境...
Java 中什么情况会导致死锁?如何避免?回答重点这是一个非常典型的八股文,即操作系统中的经典理论,死锁的发生必须满足以下四个条件,这些条件被称为“死锁的必要条件”:
互斥条件:每个资源只能被一个线程占用。
占有和等待:线程在持有至少一个资源的同时,等待获取其他资源。
不可抢占:线程所获得的资源在未使用完毕之前不能被其他线程抢占。
循环等待:多个线程形成一种头尾相接的循环等待资源关系。
...
Java 中 ReentrantLock 的实现原理是什么?回答重点ReentrantLock 其实就是基于 AQS 实现的一个可重入锁,支持公平和非公平两种方式。
内部实现依靠一个 state 变量和两个等待队列:同步队列和等待队列。
利用 CAS 修改 state 来争抢锁。
争抢不到则入同步队列等待,同步队列是一个双向链表。
条件 condition 不满足时候则入等待队列等待,是个单...
Java 中 volatile 关键字的作用是什么?回答重点volatile 它的主要作用是保证变量的可见性和禁止指令重排优化。
1)可见性(Visibility):
volatile 关键字确保变量的可见性。当一个线程修改了 volatile 变量的值,新值会立即被刷新到主内存中,其他线程在读取该变量时可以立即获得最新的值。这样可以避免线程间由于缓存一致性问题导致的“看见”旧值的现象。
...
你了解 Java 的类加载器吗?回答重点Java 的类加载器(ClassLoader)是 JVM 中用于动态加载类文件的组件。它将 .class 文件中的字节码加载到内存中,并将其转换为 Class 对象,以供 JVM 执行。
类加载器的作用:
动态加载类:在运行时根据需要加载类,而不是在编译时加载所有类。
隔离不同的类命名空间:通过不同的类加载器,可以隔离同名类,使得它们不会相互冲突...
什么是 Java 中的 ABA 问题?回答重点ABA 问题是指在多线程环境下,某个变量的值在一段时间内经历了从 A 到 B 再到 A 的变化,这种变化可能被线程误认为值没有变化,从而导致错误的判断和操作。ABA 问题常发生在使用 CAS(Compare-And-Swap) 操作的无锁并发编程中。
补充解释 CAS ABA 问题影响
CAS 是一种无锁算法,用于在多线程环境下实现原子操作。...
Java 中的强引用、软引用、弱引用和虚引用分别是什么?回答重点1)**强引用 (Strong Reference)**:
最常见的引用类型。在 Java 中,默认情况下,任何普通的对象引用都是强引用。
只要一个对象有强引用指向它,垃圾回收器永远不会回收该对象,即使系统内存紧张,宁愿抛出 OutOfMemoryError ,强引用对象也不会被清除。
2)**软引用 (Soft Refer...
为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?回答重点Java 8 移除永久代并引入元空间,主要是为了解决 PermGen 固定大小、容易导致内存溢出、GC 效率低的问题。元空间使用本地内存,具备更灵活的内存分配能力,提升了垃圾收集和内存管理的效率。
扩展知识PermGen 的局限性
固定大小:永久代的内存空间大小在 JVM 启动时是固定的,容易出...
Java 中有哪些垃圾回收算法?回答重点Java 中的垃圾回收算法主要有以下几种:
标记-清除算法(Mark-Sweep):
工作原理:首先遍历堆中的对象,标记出所有的存活对象,接着清除未标记的对象。
优点:实现简单,能够处理堆中的所有对象。
缺点:标记和清除的过程会产生内存碎片,影响后续内存分配的效率。
标记-整理算法(Mark-Compact):
工作原理:首先标记出所有存活的对象...
如何设计一个点赞系统?点赞系统看似简单,实则非常复杂,它可以从系统架构、库表设计、数据存储、性能优化、容灾备份等多个角度来思考设计。
我们可以由浅入深的向面试官来说出这个实现方案:
系统架构设计从架构方面需要考虑:服务拆分、异步、缓存。
1)分布式架构
大流量场景下,可以将点赞功能独立成一个服务,解耦业务逻辑,便于扩展和维护。例如点赞服务压力倍增的时候,可以仅扩容点赞服务即可。
2)异步处理...
如何设计一个秒杀功能?回答重点
面试官针对这个问题不指望候选人可以系统地回答出完且可落地的方案。只是想考察候选人是否拥有高并发大流量场景下的处理思路或者说能考虑到的一些关键点。
针对秒杀场景,我们需要先和面试官说出以下几个需要解决的问题点:
瞬时流量的承接
防止超卖
预防黑产
避免对正常服务的影响
兜底方案
然后可以从前后端两个视角向面试官阐述整体的设计点:
首先是前端:
利用 C...
详细描述一条 SQL 语句在 MySQL 中的执行过程。回答重点
先通过连接器校验权限
利用分析器进行 SQL 语句的词法分析和语法分析,构建解析树
使用优化器选择合适的索引和表连接顺序,最终选择一个最佳的执行计划
利用执行器,调用引擎层查询数据,返回结果集给客户端
扩展知识详细流程分析我们以一条查询 SQL 为例:select * from user where id=1;
在...
说说你知道的几种 I/O 模型回答重点1)同步阻塞 I/O(Blocking I/O,BIO)
线程调用 read 时,如果数据还未到来,线程会一直阻塞等待;数据从网卡到内核,再从内核拷贝到用户空间,这两个拷贝过程都为阻塞操作。
优点:实现简单,逻辑直观;调用后直接等待数据就绪。
缺点:每个连接都需要一个线程,即使没有数据到达,线程也会被占用,导致...
MySQL 的存储引擎有哪些?它们之间有什么区别?回答重点MySQL 的主要存储引擎包括:
1)InnoDB(重点):
支持事务、行级锁和外键。
提供高并发性能,适用于高负载的 OLTP 应用。
数据以聚集索引的方式存储,提高检索效率。
2)MyISAM(重点):
不支持事务和外键,使用表级锁。
适合读取多、更新少的场景,如数据仓库。
具有较高的读性能和较快的表级锁定。
3)MEMO...
MySQL 的索引类型有哪些?回答重点从数据结构角度来看,MySQL 索引可以分为以下几类:
B+树索引
哈希索引
倒排索引(即全文索引 Full-Text)
R-树索引(多维空间树)
从常见的基于 InnoDB B+ 树索引角度来看,可以分为:
聚簇索引(Clustered Index)
非聚簇索引(Non-clustered Index)
从索引性质的角度来看,可以分为:
普通...
MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?回答重点聚簇索引:
索引叶子结点存储的是数据行,可以直接访问完整数据。
每个表只能有一个聚簇索引,通常是主键索引,适合范围查询和排序。
非聚簇索引:
索引叶子节点存储的是数据行的主键和对应的索引列,需通过主键才能访问完整的数据行。
一个表可以有多个非聚簇索引(称之为非主键索引、辅助索引、二级索引),适用于快速查找特定列的...
MySQL 中的回表是什么?回答重点“回表” 是指在使用二级索引(非聚簇索引)作为条件进行查询时,由于二级索引中只存储了索引字段的值和对应的主键值,无法得到其它数据。如果要查询数据行中的其它数据,需要根据主键去聚簇索引查找实际的数据行,这个过程被称为回表。
扩展知识进一步理解回表举个例子:select * from user where age = 20;(user 包含 name、age、...
MySQL 的覆盖索引是什么?回答重点MySQL 的覆盖索引(Covering Index)是指二级索引中包含了查询所需的所有字段,从而使查询可以仅通过访问二级索引而不需要访问实际的表数据(主键索引)。
扩展知识覆盖索引的优点
减少I/O操作:因为查询可以直接从索引中获取所有需要的数据,避免了访问实际表的数据页,从而减少了I/O操作。
提高查询速度:索引比表数据更紧凑,因...
MySQL 的索引下推是什么?回答重点索引下推(Index Condition Pushdown, ICP)是一种减少回表查询,提高查询效率的技术。它允许 MySQL 在使用索引查找数据时,将部分查询条件下推到存储引擎层过滤,从而减少需要从表中读取的数据行,减少了 IO(本该由 Server 层做操作,交由存储引擎层因此叫做 “下推” ) 。
注意:索引下推是应用在联合索引上的。
扩展知识官...
MySQL 索引的最左前缀匹配原则是什么?回答重点MySQL 索引的最左前缀匹配原则指的是在使用联合索引时,查询条件必须从索引的最左侧开始匹配。如果一个联合索引包含多个列,查询条件必须包含第一个列的条件,然后是第二个列,以此类推。
底层原理:因为联合索引在 B+ 树中的排列方式遵循“从左到右”的顺序,例如联合索引 (first_name, last_name, age) 会按照 (first...
MySQL 中使用索引一定有效吗?如何排查索引效果?回答重点索引不一定有效。
例如查询条件中不包含索引列、低基数列索引效果不佳,或查询条件复杂且不匹配索引的顺序。
对于一些小表,MySQL可能选择全表扫描而非使用索引,因为全表扫描的开销可能更小。
最终是否用上索引是根据 MySQL 成本计算决定的,评估 CPU 和 I/O 成本最终选择用辅助索引还是全表扫描。有时候确实是全表扫描成...
在 MySQL 中建索引时需要注意哪些事项?回答重点简单总结了以下六点:
1)不能盲目建立索引,索引并不是越多越好,索引会占用空间,且每次修改的时候可能都需要维护索引的数据,消耗资源。
2)对于字段的值有大量重复的不要建立索引。比如说:性别字段,在这种重复比例很大的数据行中,建立索引也不能提高检索速度。但是也不绝对,例如定时任务的场景,大部分任务都是成功,少部分任务状态是失败的,这时候通过失...
MySQL 中的索引数量是否越多越好?为什么?回答重点索引并不是越多越好。因为索引不论从时间还是空间上都是有一定成本的
1)从时间上
每次对表中的数据进行增删改(INSERT、UPDATE 或 DELETE)的时候,索引也必须被更新,这会增加写入操作的开销。例如删除了一个 name 为面试鸭的记录,不仅主键索引上需要修改,如果 name 字段有索引,那么 name 索引也需要修改,所以索引越...
请详细描述 MySQL 的 B+ 树中查询数据的全过程回答重点1)数据从根节点找起,根据比较数据键值与节点中存储的索引键值,确定数据落在哪个区间,从而确定分支,从上到下最终定位到叶子节点2)叶子节点存储实际的数据行记录,但是一页有 16kb 大小,存储的数据行不止一条3)叶子节点中数据行以组的形式划分,利用页目录结构,通过二分查找可以定位到对应的组4)定位组后,利用链表遍历就可以找到对应的数...