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

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

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

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

一般来说有以下几条经验

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

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

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

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

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

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

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

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

参考资料:

全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务