目录
简介
一位JAVA程序员在现在公司里面担任一个核心开发,自认为能力还不错,想出去找一份高薪工作。结果去面试的时候被一道简单的问题难住了,面试官问他:“线程状态BLOCKED和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日志去定位,而了解线程的运行状态就能快速去定位具体的问题。