重新理解线程状态转化

简介

网上的线程状态转化图各式各样,描述的杂七杂八,看的云里雾里的,其实了解线程转化转化,首先要了解JVM中锁的类型,就是无锁、偏向锁、轻量级锁以及重量级锁是什么,如果读者还不知道的话,可以参考这篇文章JVM中的锁优化
同一按JVM中的定义,Java线程一共有NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING以及TERMINATED六种状态,Java中Thread代码中也有枚举类定义了这六种状态,文章接下来也围绕这六种状态。
Thread.State

状态转化图,这一张就够了

状态转化图

注意点

  1. 其实网络中很多博客,把阻塞状态进行很笼统的定义,认为RUNNABLE中的IO阻塞、WAITING、TIMED_WAITING以及BLOCKED状态都是阻塞状态,本文更清晰的将他们划分开。阻塞状态就是指BLOCKED,利用到monitor锁,而且竞争失败进入到锁对象的entrySet中等待。
  2. 以及RUNNABLE状态,状态图中可以看出,无论是CPU已经调度,还是等待CPU调度的状态,还是正在IO阻塞中的状态都为RUNNABLE
  3. 要搞懂到底锁的是啥东西,例如t线程调用join()方法,本质上是给t线程对象上锁,然后利用保护性暂定模式,然其他线程等待t线程的执行。
  4. 上图中每一个数字都代表一个锁状态转化,箭头代表方向,读者可以先试着用口头描述一下,看看能否把每一个转化都描述出来。

monitor锁

在这里插入图片描述
这张图方便读者参考,JVM中的锁优化中有详解

情况1

线程t调用t.start()方法,NEW >>> RUNNABLE

情况2

  • 当t线程调用obj.wait()方法,t线程进入obj的monitor的waitset中等待,RUNNABLE>>>WAITING

  • 当其他线程调用notify()、notifyAll()、t.interrupt()方法时

     	1.若线程竞争锁成功进入Owner中,状态WAITING>>>RUNNBALE
     	2.若线程竞争锁失败,t线程进入entrySet中等待,状态由WAITING>>>BLOCKED
    

情况3

  • 当t线程调用t.join()方法时,其他线程进入到t对象的monitor的waitSet中,其他线程RUNNABLE>>>WAITING,等待t线程执行完,也就是说,join有强制执行的意思,看源码也会发现,join中就是使用了synchronized把调用者锁住,调用wait让其他线程等待
  • 当t线程执行完后,会自动调用notifyAll()方法,将其他线程唤醒,其他线程进入entrySet中竞争,状态由WAITING>>>BLOCKED
  • 当其他线程调用**t.interrupt()**方法,强制结束t线程的运行,也会使其他线程重新开始竞争

情况4

  • t线程调用LockSupport.park()方法时,t线程RUNNABLE->WAITING
  • 当调用LockSupport.unpark(t)方法时,t线程WAITING->RUNNALE或WAITING->BLOCKED具体看有没有monitor锁,因为LockSupport比较特别,有锁无锁状态都能够调用,而obj.wait()方法,只能在有锁的情况下调用,后续会写一篇说说他们的区别。

情况5、情况6、情况7、情况8

其实搞懂情况2、情况3、情况4这四种情况就比较简单,TIMED_WAITING故名思意就是有定时的WAITING,所以调用以下方式时,会发生RUNNABLE>TIMED_WAITING状态转化

  • t.wait(time)
  • LockSupport.parkNanos(time)、LockSupport.parkUntil(time)
  • t.join(time)
  • 最后一个不太一样,Thread.sleep(time)
    然后和上述一样,调用那些方法,或者时间到了,TIMED_WAITING>>>BLOCKED或RUNNABLE

情况9、情况10

也简单说了
当调用synchronized(obj)的时候,如果没有拿到锁的执行权,线程进入BLOCKED状态
当线程执行完了,生命周期结束TERMINATED

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值