多线程实现原理
CPU让多个线程并发执行的原理是通过给每个线程分配CPU时间片,获得时间片的线程得到了执行。但是时间片非常短(一般是几十毫秒),所以CPU通过不断地切换线程执行,让我们感觉像是多个线程同时在执行。
上下文切换
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存当前任务的状态,以便下一次切换回这个任务的时候可以再加载这个文物的状态。任务从保存到再加载的过程就是一次上下文切换。
上下文的切换会影响多线程的执行效率
上下文切换的过程就类似于我们再阅读的时候遇到了不会的单词需要查字典,在查阅之前我们必须先记录当前阅读的书籍的页码和行数,等查完单词后翻开书籍继续阅读。这个切换的过程会影响读书的效率,同样上下文的切换也会影响多线程的执行效率。
线程有创建和上下文切换的开销,因此并不是任何情况下多线程都比单线程更快,只有当线程创建和切换的成本在一定程度上小于程序本身的开销的时候程序的性能才能从并发编程上获得收益。
如何减少上下文切换
- 无锁并发编程。线程竞争锁,那么就不可避免的会产生阻塞,一旦产生阻塞,该线程就处于wating状态。那么该线程放弃CPU的使用权,那么在切换至下一个任务或者线程时,需要保存该线程的状态和一些环境信息。所以在多线程并发下,多线程竞争锁,会引起上下文切换
- 使用CAS算法,Atomic包就是使用CAS算法来避免加锁的。
- 使用最少的线程。线程总数超过系统所拥有的处理器数量,就会导致过多的上下文切换。
启动更多的线程不能保证让程序最大限度地并发执行
上下文切换开销、死锁、和计算机本身硬件资源等都会影响线程的执行,并不能盲目地指望启动更多的线程来提高程序性能,反而要警惕高并发带来地副作用。