【要注意的坑】如何减少上下文切换

使用多线程时,不是多线程能提升程序的执行速度,使用多线程是为了更好地利用CPU资源

程序在执行时,多线程是CPU通过给每个线程分配CPU时间片来实现的,时间片是CPU分配给每个线程执行的时间,因时间片非常短,所以CPU通过不停地切换线程执行

线程不是越多就越好的,因为线程上下文切换是有性能损耗的,在使用多线程的同时需要考虑如何减少上下文切换

一般来说有以下几条经验

  • 无锁并发编程。多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据

  • CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁

  • 控制线程数量。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态

  • 协程。在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

    • 协程可以看成是用户态自管理的“线程”不会参与CPU时间调度,没有均衡分配到时间。非抢占式

还可以考虑我们的应用是IO密集型的还是CPU密集型的。

  • 如果是IO密集型的话,线程可以多一些。

  • 如果是CPU密集型的话,线程不宜太多。

参考资料:

全部评论

相关推荐

点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
一tiao酸菜鱼:秋招还没正式开始呢,就准备有结果了。。。。?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务