对线程的理解
一、线程是什么
进程是操作系统资源分配的最小单位(独立内存、文件句柄、CPU 上下文等),而线程是进程内部独立执行流,是 CPU 调度执行的最小单位。 一个进程至少包含一条主线程,同一进程下所有线程共享进程的堆、全局变量、文件描述符等资源;但每条线程拥有私有栈、寄存器、局部变量,彼此执行互不阻塞。
可以通俗比喻: 进程 = 一间完整办公室(拥有桌椅、打印机、文件柜全部资源); 线程 = 办公室里同时干活的员工; 整间办公室资源所有人共用,但每个员工有自己的笔记本(私有栈),能独立做自己的工作。
二、线程与进程核心区别
- 资源隔离进程间资源完全隔离,通信成本极高(管道、socket、共享内存); 同进程线程共享绝大部分资源,通信简单,直接读写全局变量即可。
- 切换开销进程切换需要更换页表、刷新缓存、重置全套资源上下文,开销巨大; 线程仅切换私有栈与寄存器,同进程资源不变,切换速度远快于进程。
- 生命周期影响主线程结束,整个进程直接销毁,所有子线程一同终止; 单个子线程退出,不影响进程与其他线程运行。
三、多线程的核心价值:并发
CPU 同一时刻只能执行一条指令,单核 CPU 依靠时间片轮转,快速切换多个线程模拟同时运行;多核 CPU 则可以真正并行,多个线程在不同核心同时执行。 多线程主要解决两类场景:
- IO 阻塞场景:网络请求、文件读写、数据库操作会让线程闲置等待。单线程会全程卡住,多线程可让等待 IO 的线程让出 CPU,其他线程继续运算,充分利用 CPU。
- 计算密集场景:多核环境拆分计算任务到多线程并行执行,缩短整体耗时,提升运算效率。
四、多线程带来的问题:线程安全
资源共享是线程优势,也是最大隐患 ——多条线程同时读写同一共享数据,会产生数据竞争、结果错乱,即线程不安全。 举例:两个线程同时对变量count++,自增分为读取、计算、写入三步,线程交替执行会丢失更新,最终数值小于预期。
常见同步解决方案:
- 互斥锁:同一时间仅一条线程访问共享资源,保证操作原子性;
- 读写锁:读多写少场景,读线程可并行,写线程独占资源;
- 原子类:底层硬件指令保证数值操作不可拆分,无锁高效;
- 线程本地存储(ThreadLocal):让数据仅当前线程私有,从根源避免竞争。
除此之外多线程还存在死锁、线程频繁切换带来的上下文开销、内存可见性、指令重排等并发问题,需要配合锁、内存屏障合理规避。
五、线程的生命周期
通用状态分为五种:
- 新建(NEW):线程对象创建完成,未调用启动方法,未分配 CPU 资源;
- 就绪(RUNNABLE):调用 start 后等待 CPU 时间片,随时可执行;
- 运行(RUNNING):拿到时间片,CPU 正在执行线程代码;
- 阻塞(BLOCKED/WAITING):等待锁、sleep、IO 阻塞、等待通知,主动放弃 CPU;
- 终止(TERMINATED):代码执行完毕或异常退出,线程销毁,无法重启。
六、总结
线程是轻量化执行单元,依托进程存在,依靠资源共享实现高效并发; 单线程逻辑简单无并发冲突,但 IO / 多核场景性能低下; 多线程能充分利用硬件资源、提升程序吞吐,但必须处理共享资源竞争、同步锁、死锁等并发难题; 开发中需要根据业务场景权衡:IO 密集型适合多线程,简单轻量任务过多线程反而会因切换损耗降低性能。
