java面试八股文2025 核心面试知识点整理

  1. 进程和线程的区别
    进程:系统运行的基本单位,包含多个线程
    线程:独立运行的最小单位,是进程的实体,多个线程共享同一进程内的系统资源

  2. 什么是线程上下文切换
    当一个线程被剥夺cpu使用权时,切换到另外一个线程执行

  3. 什么是死锁
    死锁指多个线程在执行过程中,因争夺资源造成的一种相互等待的僵局

  4. 死锁的必要条件

    • 互斥条件:同一资源同时只能由一个线程读取
    • 不可抢占条件:不能强行剥夺线程占有的资源
    • 请求和保持条件:请求其他资源的同时对自己手中的资源保持不放
    • 循环等待条件:在相互等待资源的过程中,形成一个闭环
      想要预防死锁,只需要破坏其中一个条件即可,银行家算法可以预防死锁
  5. Synchrpnized和lock的区别

    (1)synchronized是关键字,lock是一个类
    (2) synchronized在发生异常时会自动释放锁,lock需要手动释放锁
    (3)synchronized是可重入锁、非公平锁、不可中断锁,lock是可重入锁,可中断锁,可以是公平锁

  6. sleep()和wait()的区别

    • 所在类不同
      • sleep()是Thread类的静态方法。
        wait()是Object类的方法。
    • 锁释放不同
      • sleep()是不释放锁的。
        wait()是释放锁的。
    • 用途不同
      • sleep()常用于一定时间内暂停线程执行。
        wait()常用于线程间交互和通信。
    • 用法不同
      • sleep()方法睡眠指定时间之后,线程会自动苏醒。
        wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。
  7. yield() 和 join()区别

    • yield()调用后线程进入就绪状态
    • A线程中调用B线程的join() ,则B执行完前A进入阻塞状态
  8. 线程池七大参数

    1. 核心线程数:线程池中的基本线程数量
    2. 最大线程数:当阻塞队列满了之后,逐一启动
    3. 最大线程的存活时间:当阻塞队列的任务执行完后,最大线长的回收时间
    4. 最大线程的存活时间单位
    5. 阻塞队列:当核心线程满后,后面来的任务都进入阻塞队列
    6. 线程工厂:用于生产线程
    7. 拒绝策略:阻塞队列满后,拒绝任务, 有四种策略
      (1)抛异常
      (2)丢弃任务不抛异常
      (3)打回任务
      (4)尝试与最老的线程竞争

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

  1. Java内存模型

    • JMM(Java内存模型 )屏蔽了各种硬件和操作系统的内存访问差异,实现让Java程序在各平台下都能达到一致的内存访问效果,它定义了JVM如何将程序中的变量在主存中读取
    • 具体定义为:所有变量都存在主存中,主存是线程共享区域;每个线程都有自己独有的工作内存,线程想要操作变量必须从从中copy变量到自己的工作区,每个线程的工作内存是相互隔离
    • 由于主存与工作内存之间有读写延迟,且读写不是原子性操作,所以会有线程安全问题
  2. 保证并发安全的三大特性?

    • 原子性:一次或多次操作在执行期间不被其他线程影响
    • 可见性:当一个线程在工作内存修改了变量,其他线程能立刻知道
    • 有序性:JVM对指令的优化会让指令执行顺序改变,有序性是禁止指令重排
  3. volatile

    • 保证变量的可见性和有序性,不保证原子性。使用了 volatile 修饰变量后,在变量修改后会立即同步到主存中,每次用这个变量前会从主存刷新。
    • 单例模式双重校验锁变量为什么使用 volatile 修饰? 禁止 JVM 指令重排序,new Object()分为三个步骤:申请内存空间,将内存空间引用赋值给变量,变量初始化。如果不禁止重排序,有可能得到一个未经初始化的变量。
  4. 线程使用方式

    1. 继承 Tread 类
    2. 实现 Runnable 接口
    3. 实现 Callable 接口:带有返回值
  5. ThreadLocal原理

    • 原理是为每个线程创建变量副本,不同线程之间不可见,保证线程安全。每个线程内部都维护了一个Map,key为threadLocal实例,value为要保存的副本。
    • 但是使用ThreadLocal会存在内存泄露问题,因为key为引用,而value为引用,每次gc时key都会回收,而value不会被回收。所以为了解决内存泄漏问题,可以在每次使用完后删除value或者使用static修饰ThreadLocal,可以随时获取value

    ThreadLocal 的经典使用场景是数据库连接和 session 管理等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值