1、导致上下文切换的代码
Thread.sleep()
Object.wait()
Thread.yield()
Thread.join()
LockSupport.park()
2、用户态和内核态切换
Synchronized 重量级锁,使用的是操作系统本身的互斥量(mutex lock)来实现的,这个只能通过系统调用来实现,所以需要切换到内核态。
- 线程1,用户态,切换到内核态,申请锁;
- 返回用户态,执行其他任务;
- 其他任务执行完,切换到内核态,释放锁;同时唤醒其他等待的线程2;
- 返回用户态;
- 线程2、用户态,切换到内核态,等待锁,阻塞,保持内核态
- 被唤醒,获取到锁,切换回用户态
https://blog.csdn.net/No_Game_No_Life_/article/details/106100813