java并发编程的艺术 - 第一章笔记
线程上下文
CPU通过调度算法(常用时间片轮转)来切换线程,线程上下文则是在切换过程中,用来保存线程的执行状态,可以理解为当前执行线程的快照。
线程和速度
为什么多线程会快
- 串行变为并发执行
- cpu的运算速度远远大于io速度,可以将部分io阻塞的时间用于计算其他任务
什么时候多线程不会快
- 计算密集型任务,如果cpu一直保持高负荷,即使多线程也不会加快运算速度,而且会因为频繁切换上下文带来额外开销。
- 资源受限:带宽、网络连接数等(可以考虑集群的方式解决)
减少上下文切换
- 无锁并发,减少多线程竞争锁
- CAS
- 避免大量线程等待(少创建线程)
- 协程(线程内调度,上下文在线程内处理,操作系统层面是一个内核态和用户态的m:n模型,一个轻量级进程(java线程)调度多个协程,避免频繁切换内核态和用户态的开销)
锁和死锁
- 锁是为了占用资源
- 死锁是两个或更多线程争抢资源导致的等待(互相等待对方解锁)
避免死锁
- 避免一个线程获取多个锁
- 保证每个锁只占有一个资源
- 使用定时锁
- 数据库连接,加解锁操作要在一个session里