43 Star 322 Fork 3

鹏磊 / NewDevBooks

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
并发编程面试题汇总及答案(2021年并发编程面试题及答案大全).md 14.27 KB
一键复制 编辑 原始数据 按行查看 历史

并发编程面试题汇总及答案(2023年并发编程面试题及答案大全)

并发编程面试题及答案【最新版】并发编程高级面试题大全(2021版),发现网上很多并发编程面试题及答案整理都没有答案,所以花了很长时间搜集,本套并发编程面试题大全,并发编程面试题大汇总,有大量经典的并发编程面试题以及答案,包含并发编程语言常见面试题、并发编程工程师高级面试题及一些大厂并发编程开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!

这套并发编程面试题汇总大全,希望对大家有帮助哈~

博主已将以下这些面试题整理成了一个并发编程面试手册,是PDF版的

全部答案,更新日期:2023年6月11日,直接下载吧!

下载链接:高清172份,累计 7701 页大厂面试题 PDF

1、volatile关键字的作用

对于可见性,Java提供了volatile关键字来保证可见性。

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

从实践角度而言,volatile的一个重要作用就是和CAS结合,保证了原子性,详细的可以参见java.util.concurrent.atomic包下的类,比如AtomicInteger。

2、谈谈你知道的垃圾回收算法

判断对象是否可回收的算法有两种:

1、 Reference Counting GC,引用计数算法

2、 Tracing GC,可达性分析算法

3、 JVM 各厂商基本都是用的 Tracing GC 实现

4、 大部分垃圾收集器遵从了分代收集(Generational Collection)理论。

5、 针对新生代与老年代回收垃圾内存的特点,提出了 3 种不同的算法:

1、 标记-清除算法(Mark-Sweep)

标记需回收对象,统一回收;或标记存活对象,回收未标记对象。

缺点:

大量对象需要标记与清除时,效率不高

标记、清除产生的大量不连续内存碎片,导致无法分配大对象

2、 标记-复制算法(Mark-Copy)

可用内存等分两块,使用其中一块 A,用完将存活的对象复制到另外一块 B,一次性清空 A,然后改分配新对象到 B,如此循环。

缺点:

不适合大量对象不可回收的情况,换句话说就是仅适合大量对象可回收,少量对象需复制的区域

只能使用内存容量的一半,浪费较多内存空间

3、 标记-整理算法(Mark-Compact)

标记存活的对象,统一移到内存区域的一边,清空占用内存边界以外的内存。

缺点:

移动大量存活对象并更新引用,需暂停程序运行

3、程序计数器

保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空.

4、原子类的常用类

1、 AtomicBoolean

2、 AtomicInteger

3、 AtomicLong

4、 AtomicReference

5、线程的状态

![87_2.png][87_2.png]

1、 新建(new):新创建了一个线程对象。

2、 就绪(可运行状态)(runnable):线程对象创建后,当调用线程对象的 start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。

3、 运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

4、 阻塞(block):处于运行状态中的线程由于某种原因,暂时放弃对 CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被 CPU 调用以进入到运行状态。

阻塞的情况分三种:

1、 等待阻塞:

运行状态中的线程执行 wait()方法,JVM会把该线程放入等待队列(waitting queue)中,使本线程进入到等待阻塞状态;

2、 同步阻塞:

线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),,则JVM会把该线程放入锁池(lock pool)中,线程会进入同步阻塞状态;

3、 其他阻塞:

通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。

4、 死亡(dead)(结束):

线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

6、什么是IO密集

IO密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致浪费大量的CPU运算能力浪费在等待。所以在IO密集型任务中使用多线程可以大大的加速程序运行,即时在单核CPU上,这种加速主要就是利用了被浪费掉的阻塞时间。

7、哪些是 GC Roots?

1、 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

2、 在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。

3、 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。

4、 在本地方法栈中JNI(即通常所说的Native方法)引用的对象。

5、 Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。

6、 所有被同步锁(synchronized关键字)持有的对象。

7、 反映 Java 虚拟机内部情况的 JMXBean、JVMTI中注册的回调、本地代码缓存等。

8、多线程应用场景

例如:

迅雷多线程下载、数据库连接池、分批发送短信等。

9、newScheduledThreadPool

特点

创建一个固定长度的线程池,而且支持定时的以及周期性的任务执行,类似于Timer(Timer是Java的一个定时器类)

缺点:由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务(比如:一个任务出错,以后的任务都无法继续)。

10、什么是方法区

用于存储虚拟机加载的类信息,常量,静态变量等数据。

11、线程池有什么优点?

12、你能保证 GC 执行吗?

13、栈溢出的原因?

14、线程和进程区别

15、Java的双亲委托机制是什么?

16、你知道哪些垃圾收集器?

17、Executors类是什么?

18、怎么获取 Java 程序使用的内存?堆使用的百分比?

19、并发编程三个必要因素是什么?

20、线程的调度策略

21、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

22、永久代

23、什么是 Callable 和 Future?

24、CAS 的会产生什么问题?

25、as-if-serial规则和happens-before规则的区别

26、对于JDK自带的监控和性能分析工具用过哪些?

27、你对线程优先级的理解是什么?

28、垃圾回收的优点和原理。说说2种回收机制

29、如何创建守护线程?

30、创建对象的过程是什么?

31、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

32、什么是CPU密集

全部答案,更新日期:2023年6月11日,直接下载吧!

下载链接:全部答案,整理好了

新增:高清PDF:172份,7701页,最新整理

Java
1
https://gitee.com/souyunku/NewDevBooks.git
git@gitee.com:souyunku/NewDevBooks.git
souyunku
NewDevBooks
NewDevBooks
master

搜索帮助