Java多线程核心概念与线程状态详解

Executive Summary

核心观点(金字塔原理)

结论先行: 理解Java多线程的核心在于区分并行与并发、掌握线程安全的本质以及熟悉七种线程状态的转换机制。

支撑论点:

  1. 并行是多CPU真正同时执行,并发是CPU调度实现的”伪同时”,并发场景下共享资源是性能瓶颈
  2. 线程安全的本质是线程调度顺序不影响执行结果,通过同步机制人为控制共享资源访问
  3. Java线程有七种状态(新建、可运行、运行、睡眠、阻塞、等待、死亡),状态转换由JVM和程序共同控制

SWOT 分析

维度 分析
S 优势 概念清晰,通过转账代码示例直观展示线程不安全场景
W 劣势 缺乏锁机制、线程池等高级并发工具的深入讲解
O 机会 作为并发编程入门基础,适合后续深入学习JUC
T 威胁 仅掌握概念不足以应对实际并发问题,需结合实践

适用场景

  • Java并发编程入门学习
  • 面试中线程基础概念复习
  • 理解JVM线程调度机制

  • 多线程指的是这个程序(一个进程)运行时产生了不止一个线程。
  • 并行与并发
  • 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,真正的同时。
  • 并发:通过cpu调度算法,让用户看上去同时执行,实际从cpu操作层面上看不是真正的同时。并发往往在场景中有公用资源,那么针对这个公用的资源往往产生瓶颈,我们用TPS或者QPS来反应这个系统的处理能力。
  • 线程安全:经常用来描述一段代码。指在并发的情况下该代码经过多线程的使用,线程的调度顺序不能影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终的结果,如不加事务的转账代码:
vodi transferMoney(User from, User to, float amount){
    to.setMoney(to.getBlance() + amount);
    from.setMoney(from.getBlance() - amount);
}
  • 同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序,县城安全的优先级高于性能。

线程状态:

Java线程一共有七个状态,分别是新建,可运行,运行中,睡眠,阻塞,等待,死亡。

  • 新建状态New:新创建一个线程对象
  • 就绪状态Runable:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于线程池中,变得可运行,等待获取CPU的使用权。
  • 运行状态Running:就绪状态的线程获取了CPU,执行程序代码。
  • 阻塞状态Blocked:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行,直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
  1. 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中(进入这个状态会释放所占有的所有资源,与阻塞状态不同)。
  2. 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  3. 其他阻塞:运行的线程执行sleep()或join()或者发出了I/O请求时,JVM会把该线程置为阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 线程调用yield()意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其它线程处于同等竞争状态,OS有可能接着又让这个线程进入运行状态
  • 死亡状态Dead:线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

线程状态图