阿里巴巴java多线程面试题目汇总

本文总结了阿里巴巴Java多线程面试的常见问题,包括Java内存模型、线程可见性、原子性操作、线程状态、线程通信、线程池及其原理、并发工具类如CountDownLatch、CyclicBarrier、Semaphore等,以及Synchronized和锁优化策略。内容涵盖JMM、AQS、CAS算法等核心概念,帮助面试者全面了解多线程技术。
摘要由CSDN通过智能技术生成

开个小坑,小牛打算陆续开始写互联网大厂的高频面试题整理。觉着对您有帮助的点个赞哈,小牛鞠躬了。
有读者要pdf打印下来看,链接先挂这了
链接:https://pan.baidu.com/s/1Mm13XnX6_VuP3PAvUlFYCA
提取码:8yms

先来看看阿里巴巴java多线程常考的TOP5题大家会几题哈
在这里插入图片描述

简述java内存模型(JMM)

java内存模型定义了程序中各种变量的访问规则。其规定所有变量都存储在主内存,线程均有自己的工作内存。
工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。操作完成后,线程的工作内存通过缓存一致性协议将操作完的数据刷回主存。

简述as-if-serial

编译器等会对原始的程序进行指令重排序和优化。但不管怎么重排序,其结果和用户原始程序输出预定结果一致。

简述happens-before八大原则

程序次序规则:一个线程内写在前面的操作先行发生于后面的。

锁定规则: unlock 操作先行发生于后面对同一个锁的 lock 操作。

volatile 规则:对 volatile 变量的写操作先行发生于后面的读操作。

线程启动规则:线程的 start 方法先行发生于线程的每个动作。

线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。

线程终止规则:线程中所有操作先行发生于对线程的终止检测。

对象终结规则:对象的初始化先行发生于 finalize 方法。

传递性规则:如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作 C

as-if-serial 和 happens-before 的区别

as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。

简述原子性操作

一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,这就是原子性操作。

简述线程的可见性

可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。volatile,synchronized,final都能保证可见性。

简述有序性

即虽然多线程存在并发和指令优化等操作,在本线程内观察该线程的所有执行操作是有序的。

简述java中volatile关键字作用

  1. 保证变量对所有线程的可见性。
    当一条线程修改了变量值,新值对于其他线程来说是立即可以得知的。
  2. 禁止指令重排序优化。使用 volatile 变量进行写操作,汇编指令带有 lock 前缀,相当于一个内存屏障,编译器不会将后面的指令重排到内存屏障之前。

java线程的实现方式

  1. 实现Runnable接口
  2. 继承Thread类。
  3. 实现Callable接口

简述java线程的状态

线程状态有New, RUNNABLE, BLOCK, WAITING, TIMED_WAITING, THERMINATED
NEW:新建状态,线程被创建且未启动,此时还未调用 start 方法。

RUNNABLE: 运行状态。其表示线程正在JVM中执行,但是这个执行,不一定真的在跑,也可能在排队等CPU。

BLOCKED:阻塞状态。线程等待获取锁,锁还没获得。

WAITING: 等待状态。线程内run方法运行完语句Object.wait()/Thread.join()进入该状态。

TIMED_WAITING:限期等待。在一定时间之后跳出状态。调用Thread.sleep(long) Object.wait(long) Thread.join(long)进入状态。其中这些参数代表等待的时间。

TERMINATED:结束状态。线程调用完run方法进入该状态。

简述线程通信的方式

  1. volatile 关键词修饰变量,保证所有线程对变量访问的可见性。
  2. synchronized关键词。确保多个线程在同一时刻只能有一个处于方法或同步块中。
  3. wait/notify方法
  4. IO通信

简述线程池

没有线程池的情况下,多次创建,销毁线程开销比较大。如果在开辟的线程执行完当前任务后执行接下来任务,复用已创建的线程,降低开销、控制最大并发数。

线程池创建线程时,会将线程封装成工作线程 Worker,Worker 在执行完任务后还会循环获取工作队列中的任务来执行。

将任务派发给线程池时,会出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值