本文梳理Java多线程基础、实现方式、线程状态、同步机制、线程通信、线程池、并发集合等核心内容,适配日常开发与面试备考。
一、进程与线程
1. 进程:操作系统中独立运行的应用程序,系统支持多进程并发。宏观上并行执行,微观上交替占用CPU时间片串行运行。
2. 线程:进程内独立执行的任务单元,也称轻量级进程,一个进程可包含多个线程。
3. 主线程:由main方法启动,伴随main方法起止。
4. 内存特点:栈空间线程独立(存储局部变量),堆空间线程共享(存储对象)。
二、多线程三种实现方式(重点/面试)
1. 继承 Thread 类
• 自定义类继承Thread,重写run()方法。
• 创建线程对象,调用start()启动线程(自动执行run())。
2. 实现 Runnable 接口
• 自定义类实现Runnable,重写run()方法。
• 将实现类对象传入Thread构造器,调用start()启动。
• 优势:避免单继承局限,适合多线程共享资源。
3. 实现 Callable 接口(JDK5+)
• 位于java.util.concurrent,重写call(),支持返回值、可抛出异常。
• 需配合线程池和Future接收执行结果,支持异步调用。
三、线程生命周期与常用方法
1. 五大状态:新建(New) → 就绪(Ready) → 运行(Running) → 阻塞(Blocked) → 终止(Terminated),还有限时/无限等待状态。
2. sleep(long ms):线程休眠,进入限时等待;释放CPU,不释放锁。
3. join():让其他线程优先执行,当前线程进入无限等待。
四、线程同步(解决并发安全问题)
1. 临界资源:多线程共享的对象;原子操作:不可拆分的完整操作。
2. 同步目的:保证临界资源数据安全,防止原子操作被打断。
3. 同步代码块
◦ 语法:synchronized(锁对象){ 共享代码 },写在方法内部。
◦ 规则:同一时间仅一个线程获取锁,执行完毕才释放;无锁线程进入阻塞。
4. 同步方法
◦ 使用synchronized修饰方法,默认锁为this当前对象。
五、线程间通信
依托Object类三大方法,必须在同步代码块/同步方法中调用:
1. wait():线程进入无限等待,释放CPU + 释放锁。
2. notify():随机唤醒一个等待线程,不释放锁。
3. notifyAll():唤醒所有等待线程,不释放锁。
面试考点:sleep 与 wait 区别
• sleep:限时等待,释放CPU,不释放锁。
• wait:无限等待,释放CPU,同时释放锁。
六、线程池(开发常用)
1. 核心作用:复用线程,减少频繁创建、销毁线程的开销,提升性能。
2. 核心API(java.util.concurrent)
◦ Executor:顶级根接口;ExecutorService:常用子接口。
◦ 常用方法:submit()提交任务、shutdown()关闭线程池。
3. 工具类 Executors
◦ newFixedThreadPool(n):固定线程数量的线程池。
◦ newCachedThreadPool():动态扩容的缓存线程池。
七、锁体系拓展
1. Lock 接口(java.util.concurrent.locks)
◦ 比synchronized更灵活,手动加锁lock()、手动解锁unlock()(建议写在finally)。
◦ 实现类:ReentrantLock(可重入锁)。
2. 读写锁 ReadWriteLock
◦ 实现类:ReentrantReadWriteLock,分为读锁、写锁。
◦ 规则:读读不互斥,读写、写写、写读均互斥。
◦ 适用:读多写少场景,大幅提升效率。
八、并发集合(面试高频)
1. 普通集合对比
• ArrayList/HashMap:线程不安全,效率高。
• Vector/Hashtable:方法加同步锁,线程安全,效率低。
2. 高并发专用集合(java.util.concurrent)
1. CopyOnWriteArrayList
◦ 线程安全;写时拷贝新容器,读写不互斥。
◦ 特点:读多写少场景性能优异,写操作效率偏低。
2. ConcurrentLinkedQueue:基于CAS实现,线程安全的队列。
3. ConcurrentHashMap
◦ 分段锁思想,缩小锁粒度,降低锁竞争,并发效率高。
◦ 不允许null键/值;HashMap允许存null。
3. 队列 Queue
• 特点:先进先出(FIFO)。
• BlockingQueue:阻塞队列,常用实现ArrayBlockingQueue、LinkedBlockingQueue。
4. 工具方法
Collections.synchronizedXxx():可将非线程安全集合转为同步集合。
九、高频面试题速记
1. 多线程三种实现:继承Thread、实现Runnable、实现Callable+线程池。
2. sleep() 和 wait() 核心区别:锁是否释放。
3. ArrayList vs Vector / HashMap vs Hashtable:线程安全与效率取舍。
4. CopyOnWriteArrayList:写拷贝、读写不互斥,读多写少优选。
5. ConcurrentHashMap:分段锁,线程安全且并发性能优秀。



