Java并发(3)——线程状态与上下文切换

2018-06-26  本文已影响0人  alexwu59

线程状态

查询线程的状态:jstack命令

线程上下文

上下文切换:cpu上执行的一个线程由于某种原因暂停执行,切换成另一个线程执行,那么就是线程的上下文切换,在cpu进行线程切换的时候,需要将切出的线程的当前状态:通用寄存器和PC寄存器的值保存到内存中,并把切入的线程的上下文信息从内存加载到寄存器中。线程从runnable状态转换为非runnable状态都属于线程发生了上下文切换。
上下文切换发生方式:线程上下文切换分为主动式和被动式,主动方式是由线程自己发起的上下文切换
自发式:Object.wait,Thread.sleep,Thread.join,LockSupport.park
非自发式:执行到synchronized,lock,阻塞IO方式,垃圾回收

上下文切换代价:
直接代价:保存/恢复上下文的时间,从READY状态中选择一个可以执行的线程的时间(线程调度时间)
间接代价:高速缓存加载的时间
当线程被切换出去之后,可能需要把缓存中的数据刷新到内存中。

如何减少上下文切换:
1.使用无锁的多线程方式,因为多线程在访问到加锁的临界区代码,由于获取锁失败,会被切换出去。
2.使用CAS
3.减少线程数量

上一篇 下一篇

猜你喜欢

热点阅读