1.多线程:
单个CPU,可通过给线程分配时间片,通常几十ms,达到多线程效果
2.上下文切换
线程切换,需要保存本次执行信息,下次获取cpu再次执行会恢复执行信息
一出一入,就是上线程上下文切换,非常消耗效率
running -> waiting -> running
3.解决方案
无锁编程,数据按照 Hash(id) 分段取模,每个线程处理各自数据,避免切换
CAS(compare and swap) 如 Atomic 包采用的 CAS
合理创建线程,避免大部分线程处于 waiting 状态
4.线程切换类型
自发性上下文切换
Thread.sleep()
Object.wait()
Thread.yeild()
Thread.join()
LockSupport.park()
非自发性上下文切换
切出线程的时间片用完
有一个比切出线程优先级更高的线程需要被运行
虚拟机的垃圾回收动作
5.上下文开销
1.直接开销,操作系统保存回复上下文所需的开销,线程调度器调度线程的开销 2.间接开销, 处理器高速缓存重新加载的开销
上下文切换可能导致整个一级高速缓存中的内容被冲刷,即被写入到下一级高速缓存或主存
参考:
文档信息
- 本文作者:jiushun.cheng
- 本文链接:https://minipa.github.io/2016/07/08/thread-threadlocal/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)