多线程深度剖析

多线程这块有个非常重要且经典的图例,可以很好的帮助我们理解多线程,搭配API文档,应该可以轻松搞定多线程了。

如图,调用线程的start方法后,线程进入可运行状态,经过系统调度器决定是否运行,而且两者可以相互转换(Running->Runnable的一种情况是分配给线程的时间片用完了),图像上方是阻塞事件引发线程进入阻塞(不可运行)状态,引起线程阻塞的事件有:调用了sleep方法、线程调用wait方法等待特定条件的满足、线程输入/输出阻塞。左下方是访问对象的synchronized方法时,首先要进入到对象的锁池等待获得对象的所,才能够进入可运行状态,经系统调度运行,而右下方是调用对象的wait方法,wait和notify以及notifyAll均隶属于Object对象,因此任何一个对象都用这些方法,而三者又都是final的,因此该方法不能被重写,也就是说,你不能通过继承来改变其行为,阅读API文档可以知道,调用wait方法的前提是已经获得对象的锁了(也就是wait方法的调用要在synchronized方法或者synchronized块里),并且调用完wait后,该线程释放掉对象的锁,进入对象锁的等待池中,直到有notify通知他,他才会醒来进入对象的锁池里,等待获得对象的锁,一旦获得对象的锁后,便进入可运行状态。

另外,需要注意的一点是,调用线程的sleep方法,线程在睡眠的过程中并不会释放掉对象的锁。

 

转载于:https://www.cnblogs.com/Code-Rush/p/4625144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值