【要注意的坑】如何减少上下文切换
使用多线程时,不是多线程能提升程序的执行速度,使用多线程是为了更好地利用CPU资源!
程序在执行时,多线程是CPU通过给每个线程分配CPU时间片来实现的,时间片是CPU分配给每个线程执行的时间,因时间片非常短,所以CPU通过不停地切换线程执行。
线程不是越多就越好的,因为线程上下文切换是有性能损耗的,在使用多线程的同时需要考虑如何减少上下文切换
一般来说有以下几条经验
-
无锁并发编程。多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据
-
CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
-
控制线程数量。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态
-
协程。在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
-
协程可以看成是用户态自管理的“线程”。不会参与CPU时间调度,没有均衡分配到时间。非抢占式的
-
还可以考虑我们的应用是IO密集型的还是CPU密集型的。
-
如果是IO密集型的话,线程可以多一些。
-
如果是CPU密集型的话,线程不宜太多。
参考资料:
-
多线程编程-减少上下文切换(1):https://blog.csdn.net/yxpjx/article/details/52081034
-
多线程上下文切换优化与注意:https://www.cnblogs.com/signheart/p/3e3379943de1c36d5bcc7d8cee4b9825.html