第1章 并发编程的挑战
1.1 上下文切换
即使是单核处理器也支持多线程执行代码,CPU给每个线程分配CPU时间片实现多线程,而每个时间片一般是几十毫秒,所以多个线程感觉是同时执行的
但同一个核切换线程执行时会保存运行状态,以便下次切回来后读取运行,所以有上下文切换
1.1.1 多线程一定快吗?
不一定,线程有创建和上下文切换的开销
1.1.2 测试上下文切换次数和时长
略P3
1.1.3 如何减少上下文切换
1>无锁并发编程
当多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以避免使用锁,如:分段处理,不同线程处理不同段上的数据
2>CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
3>使用最少线程
避免创建不需要的线程
4>协程:
在单线程里实现多任务的调度,并在单线程里维持单个任务间的切换
1.1.4 减少上下文切换实战
P4空线程多了会影响上下文切换
1.2 死锁
1>排查:查看dump文件中堵塞状态的线程
2>如何避免线程死锁
①避免一个线程同时获取多个锁
②避免一个线程在锁内占用多个资源
③尝试使用定时锁,使用Lock.tryLock(timeout)替代内部锁
1.3 资源限制的挑战
1>硬件与软件资源会限制多线程效率,如带宽为2Mb/s,而下载速度为1Mb/s,开10个线程也不会编程10Mb/s,最多开两个
2>CPU利用率100%时,也应该考虑减少运算线程
3>软件资源一般为连接数,线程应与可拿到的连接数相关
4>内存使用过多会oom,此时也必须减少工作线程