【Java 八股】亚信科技面经学习笔记1

6 阅读5分钟

一、对并发的理解

并发是指在一段时间内,多个任务交替执行。举例:有 task1task2 两个任务,一会执行 task1、一会执行 task2;任务切换速度足够快时,宏观上看两个任务像是同时进行,但同一时刻 CPU 核心只执行一个任务,这就是并发。

在 Java 编程中:CPU 的一个核心类比为执行者,每一个任务对应一个线程。Java 内存模型(JMM)是并发编程的基石,规定:线程对共享变量的操作都必须在工作内存中执行,而非直接操作主内存。

该机制引出并发三大核心问题:

  1. 原子性:操作要么全部执行成功,要么完全不执行,不可中断。
  2. 可见性:一个线程修改共享变量后,其他线程能立即感知到变量的最新值。
  3. 有序性:程序执行顺序遵循代码编写顺序,禁止指令重排打乱业务逻辑。

Java 解决并发三大问题的常用工具:

  • 锁机制
  • volatile 关键字
  • CAS 与原子类
  • AQS
  • CompletableFuture

二、CompletableFuture 是什么

  • CompletableFuture 是 Java 8 引入 的异步编程类,是对 Future 的增强扩展。
  • Java 8 之前使用 Future 表示异步计算结果,缺点明显:只能阻塞或轮询获取结果、不支持回调
  • 早期若要实现回调,常使用 Guava 的 ListenableFuture,但容易引发回调地狱
  • CompletableFuture 优势:支持回调函数处理结果、支持多异步任务组合编排、链式调用,从根源上解决回调地狱,优雅实现异步编程。

三、如何创建线程

  1. 继承 Thread 类直接 new Thread 并重写 run() 方法;用法简单,但Java 不支持多继承,继承 Thread 后无法再继承其他类,灵活性差,不推荐。
  2. 实现 Runnable 接口将任务逻辑实现 Runnable 接口,再传入 Thread 构造器;任务与线程解耦,更灵活,可复用任务,也能交给线程池执行。
  3. Callable + FutureTask(有返回值)适合需要线程执行完毕后返回结果的场景,配合 FutureTask 可以获取线程执行返回值、捕获异常。

四、线程池七大核心参数

  1. corePoolSize:核心线程数,线程池中长期常驻的线程数量。
  2. maximumPoolSize:最大线程数,线程池允许创建的线程总数上限。
  3. keepAliveTime:空闲存活时间,非核心线程空闲超过该时间会被回收。
  4. unit:时间单位,配合 keepAliveTime 使用(秒、毫秒、分钟等)。
  5. workQueue:任务阻塞队列,核心线程满负载时,新任务进入队列排队。
  6. threadFactory:线程工厂,自定义线程创建规则,可给线程设置业务名称、守护线程等。
  7. handler:拒绝策略,队列已满且达到最大线程数时,对新任务的处理策略(抛异常、调用者执行、丢弃任务等)。

五、多服务同时修改数据库并发问题解决方案

  1. 乐观锁假设并发冲突发生率低,不上锁;更新数据时通过版本号 / 时间戳判断数据是否被其他服务修改,若已被修改则放弃本次更新或重试。
  2. 悲观锁默认并发冲突一定会发生,数据读取时直接加锁;其他服务需等待锁释放后才能操作,保证串行执行。
  3. 分布式锁基于中间件(Redis/ZooKeeper)在应用层加锁,保证同一时刻只有一个服务能操作共享数据
  4. 消息队列将修改请求存入消息队列,由单个消费者串行消费,削峰填谷,保证数据最终一致性。

六、分布式锁是什么

分布式系统中,保证跨服务、跨进程的共享资源,同一时刻只能被一个服务 / 线程访问,解决分布式环境下的数据一致性问题。

七、分布式锁实现方式(Redis 版)

常用基于 Redis 实现分布式锁:

  1. 加锁:使用原子命令 SET key value NX EX seconds

    • NX:key 不存在才设置,保证互斥
    • EX:设置过期时间,防止服务宕机导致死锁
  2. 解锁:通过 Lua 脚本 原子校验 key 归属 + 删除 key,避免误删别人的锁。

八、Spring 与 SpringBoot 区别

Spring

Spring 框架是 Spring 生态的基石,核心提供:IoC 容器、AOP 面向切面、事务管理、Spring MVC 等基础核心能力。

SpringBoot

基于 Spring Framework 的快速开发脚手架,遵循 约定大于配置;通过 Starter 依赖、自动装配、内嵌 Tomcat 等特性,简化 Spring 项目搭建与配置,开箱即用,极大提升开发效率。

九、SpringBoot 自动装配原理

基于 Spring Framework 的条件化配置 + @EnableAutoConfiguration 注解实现。原理简述:项目引入相关依赖后,SpringBoot 自动扫描依赖包,根据条件注解自动推断并装配所需组件、配置类;开发者只需引入依赖、少量配置,即可自动开启数据库、Web、中间件等功能,无需手动大量 Bean 配置。

十、Linux 常用命令

  • ls:查看目录文件
  • cd:切换工作目录
  • mkdir:新建文件夹
  • cp:文件 / 目录复制
  • mv:文件移动 / 重命名
  • touch:创建空文件
  • cat:查看小文件全部内容
  • less:分页查看大文件,支持上下滚动
  • grep:文本内容关键词搜索
  • top:实时查看系统 CPU、进程资源占用
  • chmod:修改文件权限
  • chown:修改文件所有者和所属组
  • sudo:以管理员(root)权限执行命令