【0403】32个Java 面试必考点 并发与多线程

一、问题

1、如何实现一个生产者与消费者模型?

锁、信号量、线程通信、阻塞队列

2、如何理解线程的同步与异步、阻塞与非阻塞?

3、线程池处理任务的流程是则么样的?

4、wait 与sleep 有什么区别?

A) wait 属于Object 类, sleep 属于Thread 类

B) wiat 会释放锁对象,而sleep 不会

C) 使用的位置不同,wait 需要子啊同步块中使用,sleep 可以子啊任意地方

D) sleep 需要捕获异常,而wait 不需要。

5、Synchronized 和ReentrantLocak 有什么不同? 各自使用场景?

6、读写锁适用于什么场景? ReentrantReadLocak 是如何实现的?

读写锁适合读多写少的 并发场景。

7、线程之间如何通信?

wait/notify机制,共享变量的synchronized或者Lock同步机制

8、保证线程的方法有哪些?

CAS、synchronized、Lock 以及ThreadLocal 等机制

9、如何尽可能提高多线程并发性能?

尽量减少临界范围,使用ThreadLocal,减少线程切换,使用读写锁或copyonwrite等机制

10、ThreadLocal 用来解决什么问题? ThreadLocal 是如何实现的?

ThreadLocal 不是用来解决多线程共享变量的问题,而是用来解决线程数据隔离的问题。

11、死锁的产生条件?如何分析是否由线程死锁?

12、在遇到并发问题,如何复现排查并解决?

13、了解Cached的线程池?

14、能够熟悉常用的线程分析工具与方法,会用 jstack 分析线程的运行状态,查找锁对象持有状况等?

15、了解 Java 8 对 JUC 工具类做了哪些增强,如提供了 LongAdder 来替换 AtomicLong,更适合并发度比较高的场景。

16、了解 Reactive 异步编程思想,了解 back pressure 背压的概念与应用场景。

17、要理解线程同步与互斥的原理,包括临界资源、临界区的概念,知道重量级锁、轻量级锁、自旋锁、偏向锁、重入锁、读写锁的概念。

18、掌握线程安全相关机制,如 CAS、synchronized、Lock 三种同步方式的实现原理、要明白 ThreadLocal 是每个线程独享的局部变量,了解 ThreadLocal 使用弱引用的 ThreadLocalMap 保存不同的 ThreadLocal 变量。

19、了解 JUC 中的工具类的使用场景与主要的几种工具类的实现原理,如 Reentrantlock,ConcurrentHashMap、LongAdder 等实现方式。

20、熟悉线程池的原理、使用场景、常用配置,如大量短期任务的场景适合使用 Cached 线程池;系统资源比较紧张时,可以选择固定线程池。另外注意慎用无界队列,可能会有 OOM 的风险。

21、深刻理解线程的同步与异步、阻塞与非阻塞,同步和异步的区别在于任务是否是同一个线程执行,阻塞与非阻塞的区别在于异步执行任务时,线程是会阻塞等待结果,还是会继续执行后续逻辑。

猜你喜欢

转载自blog.csdn.net/qq_40996741/article/details/109019392