内部锁的使用一定会导致上下文的切换?

如果一个线程申请一个锁时,该锁正被另一个线程所持有,那么这个线程可以进入等待状态,等待持有锁的线程释放锁,然后再去和其他线程一起竞争锁,不过这样的方法会导致线程的上下文切换,或者该线程采用忙等的方法,无限循环空操作,直到所需的条件达成,CAS就是这思想的具体实现,所以内部锁的使用不一定会导致线程的上下文切换,同时Java虚拟机也加入了适应性锁的方案,在JIT编译器的帮助下,对于一个具体的锁实例,Java虚拟机会根据其运行过程中收集到的信息来判断这个锁被线程持有的时间是长还是短,如果是锁被持有时间长的话,Java虚拟机会选择等待策略,如果锁被持有时间短的话,那么Java虚拟机会选择忙等策略。类似轻量级锁升级为重量级锁,就是多线程竞争锁,由于锁持有时间太长,忙等策略失败,过于消耗CPU,这时候就会采用等待策略,升级为重量级锁。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/107510422