本文学习自博主。
并发是为了提高程序的执行速度,并不是线程越多越好,并发过程要注意三个问题:
1.上下文切换
2.死锁
3.资源限制
上下文切换会带来额外的开销
1.线程的运行机制:
一个CPU每一时刻只能执行一条主线程;
操作系统会给每条线程分配不同长度的时间片;
操作系统会随机从就绪等待状态的线程中随机选取一条执行;
每条线程用完自己的时间片后,即使线程没有执行完毕也会停止执行,操作系统随机选取一条新线程执行;
2.上下文切换:当一条线程的时间片用完后,操作系统会停止该线程,并保存当前线程的信息状态,然后选取一条新线程来执行。
3.上下文切换是有开销的
每次上下文切换都需要保存当前线程的执行状态,并加载新线程先前状态。如果上下文切换频繁,那么CPU花在上下文切换的时间占比增加,真正处理任务的占比就会减少,因此,为了提高处理任务的 效率,我们就要减少上线问起切换次数。
4.减少上下文切换次数
减少线程的数量
控制同一线程上锁的数量
采用无锁并发编程:1)无共享变量,独立执行。2)有共享变量,控制执行顺序(CAS算法)
并发不当可能会产生死锁
1.死锁:多条线程相互等待已经被对方占用的资源时产生。
2.如何避免死锁
不要在一个线程中嵌套使用多个锁;
不要在一个线程中嵌套占用多个计算机资源;
给锁和资源加超时时间;
计算机资源会限制并发
硬件资源:磁盘读写速度,带宽等。
软件资源:Socket连接数,数据库连接数等。
当程序执行线程时,并非是一行一行的运行代码,要进行重排序。、
重排序:编译器处理器在不改变程序结果的前提下,重新排列指令的执行顺序,以达到最佳运行效率。