一、问题
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、深刻理解线程的同步与异步、阻塞与非阻塞,同步和异步的区别在于任务是否是同一个线程执行,阻塞与非阻塞的区别在于异步执行任务时,线程是会阻塞等待结果,还是会继续执行后续逻辑。