【Java面试】线程状态,BLOCKED和WAITING有什么区别

本文通过一个程序员面试经历,探讨了Java中线程BLOCKED和WAITING状态的区别。BLOCKED状态发生在线程尝试获取Synchronized锁但未成功时,而WAITING状态则是线程调用wait()等方法进入等待状态,需要其他线程唤醒。理解这些状态对于排查线程问题至关重要。
摘要由CSDN通过智能技术生成

Hi,大家好,我是Mic,一个工作了14年的程序员和创业者。

一个在北京工作了3年的粉丝,在一个公司待了3年没有跳槽。

而且他在现在公司里面担任一个核心开发,自认为能力还不错,想出去找一份高薪工作。

结果去面试的时候被一道简单的问题难住了,面试官问他:“线程状态BLOCKED和WAITING有什么区别”!

因为平时主要是做业务开发,所以线程这方面的研究很少,最后很遗憾没有通过面试。

下面看看普通人和高手对这个问题的回答。

需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。

普通人:

BLOCKED是线程,是一个阻塞状态嘛。然后WAITING是线程是等待状态。

区别就是阻塞是被动的,然后WAITING是一个条件的一个触发就是我们更多的是在就人工为主动的去触发线程的一种头等待的一个状态,所以我认为它们区别一个是在被动和主动的一个区别吧。

高手:

好的,面试官。

BLOCKED和WAITING都是属于线程的阻塞等待状态。

BLOCKED状态是指线程在等待监视器锁的时候的阻塞状态。

也就是在多个线程去竞争Synchronized同步锁的时候,没有竞争到锁资源的线程,会被阻塞等待,这个时候线程状态就是BLOCKED。

在线程的整个生命周期里面,只有Synchronized同步锁等待才会存在这个状态。

WAITING状态,表示线程的等待状态,在这种状态下,线程需要等待某个线程的特定操作才会被唤醒。我们可以使用Object.wait()、Object.join()、LockSupport.park()这些方法

使得线程进入到WAITING状态,在这个状态下,必须要等待特定的方法来唤醒,

比如Object.notify方法可以唤醒Object.wait()方法阻塞的线程

LockSupport.unpark()可以唤醒LockSupport.park()方法阻塞的线程。

所以,在我看来,BLOCKED和WAITING两个状态最大的区别有两个:

  • BLOCKED是锁竞争失败后被被动触发的状态,WAITING是人为的主动触发的状态

  • BLCKED的唤醒时自动触发的,而WAITING状态是必须要通过特定的方法来主动唤醒

以上就是我对这个问题的理解。

总结

线程的生命周期以及在Java里面有哪些方式导致线程声明周期的变化。

是非常重要的基础知识,因为在应用里面一定会用到线程,而一旦线程出现故障,

我们就需要根据线程的dump日志去定位,而了解线程的运行状态就能快速去定位具体的问题。

大家记得点赞收藏加关注。

需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以扫描下方二维码

↓↓↓↓↓↓↓↓↓↓↓↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跟着Mic学架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值