AQS和Synchronized一个疑问
来源:9-4 synchronized和ReentrantLock的区别
lzx_wh
2019-12-24
在Reentrantlock实现中用的是Unsafe.park让线程进入WAITING状态,而Synchronized在进入重量级锁以后是将线程至于Blocked状态,想请教下老师为什么这两个锁对于锁住线程要选用不同的线程状态呢?我看《深入理解JAVA虚拟机》一书提到,synchronized进入重量级锁会导致用户态与内核态的切换影响性能,那么可以理解为线程需要处于Blocked状态是要进行内核状态切换的,那WAITING状态也就是用Unsafe.park是否也会涉及内核状态切换呢?
这个问题我有查过,甚至是在oracle官网文档对于线程的状态定义也没有明确描述,不知道老师是否研究过这块,还望不吝赐教,谢谢!
写回答
1回答
-
翔仔
2019-12-24
同学好,其实这个就好比是sleep和wait的区别,wait的话会释放CPU资源和资源,所以也是有CPU的上下文切换的。
线程状态blocked和waiting, blocked是线程由于获取不到资源被阻塞了,而waiting一般是主动进入,等待相应的动作被触发。Synchroized是对相应的资源进行加锁,获取不到的所以进入了blocked状态,而AQS里大量使用了CAS进行等待。
00
相似问题