【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主生存追究权)
https://www.cnblogs.com/cnb-yuchen/p/18162522
出自【进步*于辰的博客】
线程生命周期与进程有诸多相似,所以我们很容易将两者关联理解并肴杂,一些细节之处确有许多差别,因为线程调理与进程调理虽都由CPU完成,但两者并不雷同。
特意泯灭一些时间,系统地对线程生命周期与线程通信进行梳理、整理。
启发博文:《线程的生命周期及五种基本状态》(转发)。引用其中一张线程生命周期图:
三种阻塞情况的变动主要因“线程通信”引起,变化仅是阻塞情况的变化,状态不变,还是Blocked。点出两个问题:
“挂起”状态是一种类似Runnable(停当)状态的状态,差别之处是进入停当状态的线程,会开释所持有的“同步锁”,而“挂起”状态不会,“挂起”状态相称于“停息”,故容易导致“死锁”。为什么那4个方法会被放弃?
启发博文:《线程间通信的几种实现方式》(转发)。我暂未整理“线程通信”相干理论,故下文将以示例的情势进行阐述。
如果大家不了解volatile关键字,看这里。这里线程通信使用的是volatile关键字“包管可见性”的原理。
为什么调用notify()/notifyAll(),线程由等待Blocked变为锁定Blocked?答案就在以上代码的执行过程中,我给大家捋一捋。
t1 等待被唤醒,主线程等待 t1 运行完。因此,必须使用同步锁,且必须是同一把锁(lock)、
看这里 → 《这一次,彻底搞懂Java中的synchronized关键字》(转发)。大家找到【1.同步代码块】这一栏,底层逻辑相似。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |