Java多线程全解笔记从进程线程到线程池并发集合面试干货前言本文整合Java多线程核心知识点进程线程基础、线程5大状态、synchronized同步、wait/notify通信、线程池、Callable、Lock锁、并发安全集合覆盖课堂重点高频面试题适合复习、面试复盘。一、进程与线程基础1.进程操作系统中独立运行的应用程序OS支持多进程并发- 微观串行执行轮流抢占CPU时间片- 宏观并行运行看起来同时执行。2.线程进程内的独立任务单元轻量化进程一个进程包含多条线程。1. 主线程 main() 方法所在线程程序入口。2. 内存特点- 栈线程私有存局部变量- 堆进程共享所有线程共用存放对象。3. 创建线程3种方式必考|实现方式|写法要点|| ---- | ---- ||继承Thread类|子类重写 run() new对象.start() 启动||实现Runnable接口|实现 run() 对象传入Thread构造start启动||实现Callable接口|带返回值、抛异常配合线程池Future使用|注意 start() 才会创建线程、由JVM调用run直接调用run只是普通方法。二、线程6种生命周期状态New(新建)→Ready(就绪)→Running(运行)→阻塞/等待→Terminated(终止)1. New新建 new Thread() 仅分配内存未启动2. Ready就绪调用 start() 等待CPU时间片3. Running运行抢到CPU时间片执行run时间片用完回到就绪4. Blocked阻塞抢 synchronized 锁失败等待释放锁5. TimedWaiting限时等待 sleep(毫秒) 休眠固定时长不释放锁6. Waiting无限等待 wait() / join() 等待唤醒释放锁7. Terminated终止run方法执行完毕线程消亡。面试 sleep() 和 wait() 区别1. sleepThread方法限时休眠不放锁、到期自动就绪2. waitObject方法无限等待释放锁、需要notify唤醒必须在同步代码内使用。三、线程同步 synchronized解决多线程数据错乱1.核心概念- 临界资源多线程共享的同一个对象- 原子操作不可拆分的代码要么全执行、要么不执行- 同步目的保证原子操作不被打断避免并发错乱。2.两种同步写法1. 同步代码块javasynchronized(临界资源对象){//原子操作代码}锁指定对象只有拿到锁标记才能执行代码没拿到进入阻塞。2. 同步方法方法上加 synchronized 等价于 synchronized(this) 锁当前实例对象。四、线程间通信 wait notifyObject提供的等待/通知机制必须在同步代码块使用1. wait() 释放锁CPU进入无限等待2. notify() 随机唤醒1条等待线程3. notifyAll() 唤醒全部等待线程通知不会立刻释放锁要等同步代码执行完才释放。五、线程池开发常用减少频繁创建销毁线程开销1.核心API java.util.concurrent 包1. Executor 顶层根接口2. ExecutorService 线程池常用接口核心方法- submit(Runnable) 提交无返回任务- submit(Callable) 提交带返回任务返回Future接收结果- shutdown() 关闭线程池。3. Executors 工具类快速创建线程池- newFixedThreadPool(n) 固定线程数量的线程池- newCachedThreadPool() 动态扩容无上限线程池。六、Callable接口有返回值的线程任务1. JDK5新增替代Runnable V call() 有泛型返回值、可抛异常2. Future.get() 阻塞获取Callable任务返回结果3. 分类- 同步调用等待方法执行完再向下走- 异步调用提交任务后主线程继续执行后续再拿结果。七、Lock锁与读写锁替代synchronized灵活1.ReentrantLock 独占锁javaLock locknew ReentrantLock();lock.lock();//加锁try{//业务代码}finally{lock.unlock();//finally必释放锁防止死锁}2.ReentrantReadWriteLock读写锁- 读读不互斥、读写/写读/写写全部互斥- 适用读多写少场景大幅提升并发效率。八、并发安全集合面试高频对比1.普通非安全集合多线程并发报错ArrayList、HashMap、HashSet 线程不安全、无同步锁、效率高。2.老式安全集合加全量synchronized效率低Vector、Hashtable 方法全同步性能差逐步淘汰。3.JUC高效并发集合 java.util.concurrent 1. CopyOnWriteArrayList写时复制新数组加锁、读无锁读多写少优先用读安全高效。和ArrayList区别ArrayList不安全COW写复制、线程安全、读性能接近ArrayList。2. ConcurrentHashMapJDK分段锁机制细分锁粒度分段加锁并发性能远高于Hashtable不允许key/value为null。3. ConcurrentLinkedQueueCAS无锁实现的线程安全队列。4. BlockingQueue阻塞队列 ArrayBlockingQueue(数组定容)、LinkedBlockingQueue(链表不定容) 生产消费模型常用。集合整体架构图plaintextCollection├─List有序、可重复、带索引│ ├ArrayList、LinkedList、Vector、CopyOnWriteArrayList├─Set无序、不可重复│ ├HashSet、TreeSet、LinkedHashSet├─QueueFIFO队列│ ├LinkedList、ConcurrentLinkedQueue、BlockingQueue实现类Map├HashMap、Hashtable、LinkedHashMap、ConcurrentHashMap、TreeMap九、高频面试题汇总1. sleep和wait区别见上文2. ArrayList和Vector/CopyOnWriteArrayList区别3. HashMap、Hashtable、ConcurrentHashMap区别4. 实现多线程三种方式优缺点5. synchronized和Lock区别结尾本篇覆盖JavaSE多线程全部考点日常开发、期末复习、面试背记均可直接使用。
Java多线程全解笔记|从进程线程到线程池+并发集合(面试干货)
发布时间:2026/6/3 15:48:21
Java多线程全解笔记从进程线程到线程池并发集合面试干货前言本文整合Java多线程核心知识点进程线程基础、线程5大状态、synchronized同步、wait/notify通信、线程池、Callable、Lock锁、并发安全集合覆盖课堂重点高频面试题适合复习、面试复盘。一、进程与线程基础1.进程操作系统中独立运行的应用程序OS支持多进程并发- 微观串行执行轮流抢占CPU时间片- 宏观并行运行看起来同时执行。2.线程进程内的独立任务单元轻量化进程一个进程包含多条线程。1. 主线程 main() 方法所在线程程序入口。2. 内存特点- 栈线程私有存局部变量- 堆进程共享所有线程共用存放对象。3. 创建线程3种方式必考|实现方式|写法要点|| ---- | ---- ||继承Thread类|子类重写 run() new对象.start() 启动||实现Runnable接口|实现 run() 对象传入Thread构造start启动||实现Callable接口|带返回值、抛异常配合线程池Future使用|注意 start() 才会创建线程、由JVM调用run直接调用run只是普通方法。二、线程6种生命周期状态New(新建)→Ready(就绪)→Running(运行)→阻塞/等待→Terminated(终止)1. New新建 new Thread() 仅分配内存未启动2. Ready就绪调用 start() 等待CPU时间片3. Running运行抢到CPU时间片执行run时间片用完回到就绪4. Blocked阻塞抢 synchronized 锁失败等待释放锁5. TimedWaiting限时等待 sleep(毫秒) 休眠固定时长不释放锁6. Waiting无限等待 wait() / join() 等待唤醒释放锁7. Terminated终止run方法执行完毕线程消亡。面试 sleep() 和 wait() 区别1. sleepThread方法限时休眠不放锁、到期自动就绪2. waitObject方法无限等待释放锁、需要notify唤醒必须在同步代码内使用。三、线程同步 synchronized解决多线程数据错乱1.核心概念- 临界资源多线程共享的同一个对象- 原子操作不可拆分的代码要么全执行、要么不执行- 同步目的保证原子操作不被打断避免并发错乱。2.两种同步写法1. 同步代码块javasynchronized(临界资源对象){//原子操作代码}锁指定对象只有拿到锁标记才能执行代码没拿到进入阻塞。2. 同步方法方法上加 synchronized 等价于 synchronized(this) 锁当前实例对象。四、线程间通信 wait notifyObject提供的等待/通知机制必须在同步代码块使用1. wait() 释放锁CPU进入无限等待2. notify() 随机唤醒1条等待线程3. notifyAll() 唤醒全部等待线程通知不会立刻释放锁要等同步代码执行完才释放。五、线程池开发常用减少频繁创建销毁线程开销1.核心API java.util.concurrent 包1. Executor 顶层根接口2. ExecutorService 线程池常用接口核心方法- submit(Runnable) 提交无返回任务- submit(Callable) 提交带返回任务返回Future接收结果- shutdown() 关闭线程池。3. Executors 工具类快速创建线程池- newFixedThreadPool(n) 固定线程数量的线程池- newCachedThreadPool() 动态扩容无上限线程池。六、Callable接口有返回值的线程任务1. JDK5新增替代Runnable V call() 有泛型返回值、可抛异常2. Future.get() 阻塞获取Callable任务返回结果3. 分类- 同步调用等待方法执行完再向下走- 异步调用提交任务后主线程继续执行后续再拿结果。七、Lock锁与读写锁替代synchronized灵活1.ReentrantLock 独占锁javaLock locknew ReentrantLock();lock.lock();//加锁try{//业务代码}finally{lock.unlock();//finally必释放锁防止死锁}2.ReentrantReadWriteLock读写锁- 读读不互斥、读写/写读/写写全部互斥- 适用读多写少场景大幅提升并发效率。八、并发安全集合面试高频对比1.普通非安全集合多线程并发报错ArrayList、HashMap、HashSet 线程不安全、无同步锁、效率高。2.老式安全集合加全量synchronized效率低Vector、Hashtable 方法全同步性能差逐步淘汰。3.JUC高效并发集合 java.util.concurrent 1. CopyOnWriteArrayList写时复制新数组加锁、读无锁读多写少优先用读安全高效。和ArrayList区别ArrayList不安全COW写复制、线程安全、读性能接近ArrayList。2. ConcurrentHashMapJDK分段锁机制细分锁粒度分段加锁并发性能远高于Hashtable不允许key/value为null。3. ConcurrentLinkedQueueCAS无锁实现的线程安全队列。4. BlockingQueue阻塞队列 ArrayBlockingQueue(数组定容)、LinkedBlockingQueue(链表不定容) 生产消费模型常用。集合整体架构图plaintextCollection├─List有序、可重复、带索引│ ├ArrayList、LinkedList、Vector、CopyOnWriteArrayList├─Set无序、不可重复│ ├HashSet、TreeSet、LinkedHashSet├─QueueFIFO队列│ ├LinkedList、ConcurrentLinkedQueue、BlockingQueue实现类Map├HashMap、Hashtable、LinkedHashMap、ConcurrentHashMap、TreeMap九、高频面试题汇总1. sleep和wait区别见上文2. ArrayList和Vector/CopyOnWriteArrayList区别3. HashMap、Hashtable、ConcurrentHashMap区别4. 实现多线程三种方式优缺点5. synchronized和Lock区别结尾本篇覆盖JavaSE多线程全部考点日常开发、期末复习、面试背记均可直接使用。