Java多线程面试题(面试必备)

2022/4/13 9:14:30

本文主要是介绍Java多线程面试题(面试必备),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录
一、多线程基础基础知识
1. 并发编程
1.1 并发编程的优缺点
1.2 并发编程的三要素
1.3 并发和并行有和区别
1.4 什么是多线程,多线程的优劣?
2. 线程与进程
2.1 什么是线程与进程
2.2 线程与进程的区别
2.3 用户线程与守护线程
2.4 什么是线程死锁
2.5 形成死锁的四个必要条件
2.6 如何避免死锁
2.7 什么是上下文的切换
3. 创建线程
3.1 创建线程的四种方式
3.2 Runnable接口和Callable接口有何区别
3.2 run()方法和start()方法有和区别
3.3 为什么调用start()方法会执行run()方法,为什么不能直接调用run()方法
3.4 什么是Callable和Future
3.5 什么是FutureTask
4. 线程状态和基本操作
4.1 线程声明周期的6种状态
4.2 Java用到的线程调度算法是什么?
4.2 Java线程调度策略
4.3 什么是线程调度(Thread Scheduler)和时间分片(Time Slicing )
4.4 Java线程同步和线程调度的相关方法
4.5 sleep()和wait()有什么区别
4.6 你是如何调用wait()方法的,使用if还是循环
4.7 为什么线程通信方法wait(),notify(),notifyAll()要被定义到Object类中
4.8 为什么线程通信方法wait(),notify(),notifyAll()要在同步代码块或同步方法中被调用?
4.9 Thread的yiele方法有什么作用?
4.10 为什么Thread的sleep和yield是静态的?
4.11 线程sleep和yield方法有什么区别
4.12 如何停止一个正在运行的线程?
4.13 如何在两个线程间共享数据?
4.14 同步代码块和同步方法怎么选?
4.15 什么是线程安全?Servlet是线程安全吗?
4.16 线程的构造方法,静态块是被哪个线程类调用的?
4.17 Java中是如何保证多线程安全的?
4.18 线程同步和线程互斥的区别
4.19 你对线程优先级有什么理解?
4.20 谈谈你对乐观锁和悲观锁的理解?
一、多线程基础基础知识
1. 并发编程
1.1 并发编程的优缺点
优点:

充分利用多核CPU的计算能力,通过并发编程的形式将多核CPU的计算能力发挥到极致,性能得到提升。
方面进行业务的拆分。提高系统并发能力和性能:高并发系统的开发,并发编程会显得尤为重要,利用好多线程机制可以大大提高系统的并发能力及性能;面对复杂的业务模型,并行程序会比串行程序更适应业务需求,而并发编程更适合这种业务拆分。cai
缺点:

并发编程的目的是为了提高程序的执行效率,提高程序运行速度,但并发编程并不是总能提高性能,有时还会遇到很多问题,例如:内存泄漏,线程安全,死锁等。
1.2 并发编程的三要素
并发编程的三要素:(也是带来线程安全所在)

原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。
可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)
有序性:程序的执行顺序按照代码的先后顺序
线程安全的问题原因有:

1. 线程切换带来的原子性问题
2. 缓存导致的可见性问题
3. 编译优化带来的有序性问题
1
2
3
解决方案:

JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题
1.3 并发和并行有和区别
并发:多个任务在同一个CPU上,按照细分的时间片轮流交替执行,由于时间很短,看上去好像是同时进行的。
并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的同时进行。
串行:有n个任务,由一个线程按照顺序执行。

1.4 什么是多线程,多线程的优劣?
定义:多线程是指程序中包含多个流,即在一个程序中可以同时进行多个不同的线程来执行不同的任务
优点:

可以提高CPU的利用率,在多线程中,一个线程必须等待的时候,CPU可以运行其它线程而不是等待,这样就大大提高了程序的效率,也就是说单个程序可以创建多个不同的线程来完成各自的任务。
缺点:
线程也是程序,线程也需要占内存,线程也多内存也占的也多。
多线程需要协调和管理,所以需要CPU跟踪线程。
线程之间共享资源的访问会相互影响,必须解决禁用共享资源的问题。
2. 线程与进程
2.1 什么是线程与进程
进程:内存中运行的运用程序,每个进程都有自己独立的内存空间,一个进程可以由多个线程,例如在Windows系统中,xxx.exe就是一个进程。
线程:进程中的一个控制单元,负责当前进程中的程序执行,一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可以共享数据。

2.2 线程与进程的区别
根本区别:进程是操作系统资源分配的基本单元,而线程是处理器任务调度的和执行的基本单位。
资源开销:每个进程都有自己独立的代码和空间(程序上下文),程序之间的切换会有较大的开销;线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行的过程不是一条线的,而是多条线(多个线程),共同完成;线程是进程的一部分,可以把线程看作是轻量级的进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

2.3 用户线程与守护线程
用户(User)线程:运行在前台,执行具体任务,如程序的主线程,连接网络的子线程都是用户线程。
守护(Daemon)线程:运行在后台,为其它前台线程服务,也可以说守护线程是JVM非守护线程的”佣人“,一旦所有线程都执行结束,守护线程会随着JVM一起结束运行。
main函数就是一个用户线程,main函数启动时,同时JVM还启动了好多的守护线程,如垃圾回收线程,比较明显的区别时,用户线程结束,JVM退出,不管这个时候有没有守护线程的运行,都不会影响JVM的退出。

2.4 什么是线程死锁
死锁是指两个或两个以上进程(线程)在执行过程中,由于竞争资源或由于彼此通信造成的一种堵塞的现象,若无外力的作用下,都将无法推进,此时的系统处于死锁状态。
如图,线程A拥有的资源2,线程B拥有的资源1,此时线程A和线程B都试图去拥有资源1和资源2,但是它们的



这篇关于Java多线程面试题(面试必备)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程