# 《并发设计模式》第08章-保护性暂挂模式-线程的流转状态

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:掌握线程在实际项目执行过程中的流转状态,能够结合线程在执行过程中的流转状态定位线程安全问题。重点掌握线程的生命周期状态流转图,并能够基于线程的生命周期状态流转图灵活应对各种面试和实际项目调优场景,并且能够将线程的流转状态相关的知识灵活应用的自身实际项目中。

大家好,我是冰河~~

无论是在面试还是在平时的工作过程中,线程的生命周期状态都是非常重要的,熟练掌握线程的生命周期状态流转,有助于我们更好的应对并发编程的面试场景,更能为我们解决生产环境的线程安全问题提供分析指导,例如快速定位线上死锁问题、循环等待问题、CPU资源占用率高问题等等。

# 一、故事背景

随着小菜在公司的时间越来越长,技术能力也得到了进一步的提升,这天,他接到一个在公司交易系统中开发转账功能的需求。说到转账,无非就是两个账户之间的交易,一个账户的金额增加,同时,一个账户的金额减少,在交易的过程中要处理各种校验的问题。起初,小菜把需求理的很顺,功能写起来也是得心应手,但是交付测试后,实际的测试效果性能太差。

经过反复的排查和定位,小菜还是未能找出问题的根源,也没能解决问题。于是小菜决定还是寻求老王的帮助,老王也耐心的为小菜进行了讲解,并且小菜也对老王的讲解进行了总结。

# 二、寻求帮助

经过时间的排查和定位问题,小菜终究还是没能找到问题所在,于是便走到老王的身边说:“老大,最近分配给我的任务,功能是做完了,但是测试的效果却是性能很差,我找了半天问题,还是没能找到问题到底出现在哪里,你可以帮我看看吗”?

“可以,走,我看看你写的代码”。

于是老王和小菜走到了小菜的工位上。

老王打开小菜写的代码,只是扫了一眼,便找到了问题所在。

于是老王对小菜说:“代码写的确实有问题,你这代码的实现很适合使用Guarded Suspension设计模式,也就是保护性暂挂模式,你对这些知识了解吗?”。

“不怎么了解”,小菜回应到。

“好,那我给你系统的讲一讲,不过要搞懂Guarded Suspension设计模式,首先,要搞懂线程的生命周期和状态流转过程,这些你了解吗?”。

“之前看过,但是不怎么熟悉”。

“好,那我们今天就讲讲线程的生命周期和状态的流程过程”。

“好的”。

于是老王带着小菜走进了会议室,开始吧啦吧啦的讲起来。

# 二、线程的生命周期

说起线程的生命周期,我们不得不提的就是线程在执行过程中的六种状态,如图8-1所示。


对于Java程序来说,线程生命周期的核心就是如图8-1所示的六种状态,理解并掌握了线程生命周期的六种状态,有助于我们灵活的应对并发编程的面试场景与排查和定位生产环境的线程安全问题。

线程的六种状态其实是在Java的Thread类中定义了一个枚举进行表示,Thread类的源码详见:java.lang.Thread。在Thread类中有一个State枚举,其中就定义了线程在执行过程中的六种状态。

public enum State {
    //初始化状态
    NEW,
    //可运行/运行状态
    RUNNABLE,
    //阻塞状态
    BLOCKED,
    //等待状态
    WAITING,
    //超时等待状态
    TIMED_WAITING,
    //终止状态
    TERMINATED;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

“这些都能看懂吧?”,老王问小菜。

“可以看懂”,小菜回应道。

“好,那我继续讲讲线程状态的流转过程”。

# 四、线程状态的流转

在Java中,线程状态的流转过程如图8-2所示。

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码