请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

AQS和Synchronized一个疑问

在Reentrantlock实现中用的是Unsafe.park让线程进入WAITING状态,而Synchronized在进入重量级锁以后是将线程至于Blocked状态,想请教下老师为什么这两个锁对于锁住线程要选用不同的线程状态呢?我看《深入理解JAVA虚拟机》一书提到,synchronized进入重量级锁会导致用户态与内核态的切换影响性能,那么可以理解为线程需要处于Blocked状态是要进行内核状态切换的,那WAITING状态也就是用Unsafe.park是否也会涉及内核状态切换呢?
这个问题我有查过,甚至是在oracle官网文档对于线程的状态定义也没有明确描述,不知道老师是否研究过这块,还望不吝赐教,谢谢!

正在回答 回答被采纳积分+3

1回答

翔仔 2019-12-24 19:39:52

同学好,其实这个就好比是sleep和wait的区别,wait的话会释放CPU资源和资源,所以也是有CPU的上下文切换的。

线程状态blocked和waiting, blocked是线程由于获取不到资源被阻塞了,而waiting一般是主动进入,等待相应的动作被触发。Synchroized是对相应的资源进行加锁,获取不到的所以进入了blocked状态,而AQS里大量使用了CAS进行等待。


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信