当前位置: 首页 > 图灵资讯 > 技术篇> 总结10道java并发面试题(附答案)

总结10道java并发面试题(附答案)

来源:图灵教育
时间:2023-03-29 15:13:53

在java面试中,面试官会专注于考试察应聘除了计算机常识,Java的基础知识是框架,服务器和各种开发工具等待一系列内容。本文总结了今天的文章并发java面试题java重要的一个知识点,当然面试频率也比较高,有面试需要的朋友可以学习以下内容。

1、什么是并发?

答:是指在一定时间内交替执行多任务的任务。操作时有多个线程CPU运行时间分为几个时间段,然后将时间段分配给每个线程执行。 当线程代码在一段时间内运行时,其他线程处于悬挂状。

2、并发和并行有什么区别?

答:并发和并行是一个很容易混淆的概念。并发是指多个任务的交替,而平行是指真正意义上的“同时进行”。事实上,如果系统中只有一个CPU,在实际系统环境中不能并行使用多线程,则只能通过切换时间片来交替执行任务。真正的平行只能出现在拥有多个CPU的系统中。

并发: 同时,许多任务正在执行中 (单位时间内不一定同时执行);

并行: 在单位时间内,同时执行多项任务。

3、为什么要使用并发?

答:并发编程在一定程度上离不开多核CPU的发展。随着单核CPU的研发,无法遵循“摩尔定律”(摩尔定律是基于硬件开发的观测定律,也是基于“摩尔定律”的“反摩尔定律”,不过“反摩尔定律”是软件领域的定律,有兴趣的可以自己理解),为了进一步提高计算速度,硬件工程师不再追求单独的计算单元,而是将多个计算单元集成在一起,即形成多核CPU。短短十几年,Intel等家用CPU i7可以达到4个甚至8个核心。短短十几年,Intel等家用CPU i7可以达到4个甚至8个核心。专业服务器通常可以达到几个独立的CPU,每个CPU甚至有8个以上的核心。因此,“摩尔定律”它似乎继续体验CPU的核心扩展。在多核CPU的背景下,并发编程的趋势应运而生。通过并发编程,可以充分发挥多核CPU的计算能力,提高其性能。

4、并发编程有哪些缺点?

答:(1)上下文切换频繁

时间片是CPU分配给每个线程的时间,因为时间很短,所以CPU不断切换线程,让我们觉得多个线程是同时执行的,时间片通常是几十毫秒。每次切换时,都需要保存当前状态,以恢复以前的状态。这种切换行为非常失去性能。过于频繁的切换不能充分发挥多线程编程的优势。无锁并发编程可用于通常减少上下文切换。 CAS算法,使用最少的线程和使用协程。

2)线程的安全问题

多线程编程中最难把握的是临界区域的线程安全。如果你不注意,就会有死锁。一旦产生死锁,系统功能将不可用。

5、上下文切换是什么?

答:多线程编程中一般线程的数量大于 CPU 核心数,而一个 CPU 为了有效地执行这些线程,核心只能在任何时候使用一个线程,CPU 策略是将时间片分配到每个线程并旋转。当一个线程的时间片用完时,它将重新处于就绪状态,供其他线程使用。这个过程属于上下文切换。

上下文切换通常是计算密集型的。换句话说,它需要相当可观的处理器时间。在每秒几十次或数百次的切换中,每次切换都需要纳秒量级时间。因此,上下文切换意味着系统消耗了大量事实上,CPU时间可能是操作系统中时间消耗最大的操作。Linux与其他操作系统相比(包括其他类别)Unix系统有很多优点,其中之一就是上下文切换和模式切换的时间消耗很少。

6、说说slep()和wait()的区别和共同点

答:(1)两者的主要区别在于sleep方法没有释放锁,而waitt 释放锁的方法 ;(2)两者都可以暂停执行线程;(3)Wait 通常用于线程间交互/通信,sleep通常用于暂停执行;(4)wait() 调用方法后,线程不会自动醒来,其他线程需要在同一对象上调用同一对象 notify() 或者 notifyAll() 方法。sleep() 实施方法后,线程会自动苏醒。

7、volatile变量和atomic变量有什么区别?

答:首先,volatile变量看起来像atomic变量,但功能不同。Volatile变量可以保证先行关系,即后续读操作前会发生写操作, 但它不能保证原子性。例如,如果用volatile修改count变量,那么counttile++ 操作不是原子性的。Atomicinteger类提供的Atomic方法可以使该操作具有原子性,如getandincrement()方法可以增加原子性,并添加当前值,其他数据类型和引用变量也可以进行类似的操作。

8、使用多线程可能会带来什么问题?

答:并发编程的目的是提高程序执行效率和程序运行速度,但并发编程并不总是提高程序运行速度,并发编程可能会遇到内存泄漏、上下文切换、死锁、硬件和软件资源闲置等诸多问题。

9、简要总结线程与过程的关系?

答:一个过程中可以有多个线程,多个线程共享过程的堆叠和方法区 (JDK1.8 之后的元空间)资源,但每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。综上所述,线程是过程划分为较小的操作单元。线程和过程最大的区别在于,每个过程基本上都是独立的,而每个线程都不一定,因为同一过程中的线程很可能相互影响。线程执行成本小,但不利于资源管理和保护;过程恰恰相反。

10、为什么程序计数器是私有的?

答:程序计数器有两个主要功能:(1)字节码解释器通过改变程序计数器依次读取指令,实现顺序执行、选择、循环、异常处理等代码流程控制;(2)在多线程的情况下,程序计数器用于记录当前线程执行的位置,以便在线程切换回来时知道线程上次在哪里运行。需要注意的是,如果实施了native方法,那么程序计数器记录了undefined地址,下一个指令的地址只记录在java代码中。

因此,程序计数器私有主要是为了在线程切换后恢复到正确的执行位置。

上总10道java并发面试题比较重要的知识,在许多互联网公司java面试都出现了。既然频率这么高,也说明了。10道java题中涉及的Java并发知识点重要,所以请务必将就在10个题目中,我理解了自己的盲点,顺利应对了面试,通过了java面试。