并发编程介绍
一、串行与并行的区别
A->B->C->D四个流程
串行,根据路线,一个个走完流程。并行,如果没有前提的情况下,ABCD可以同时执行。
二、并发编程的目的
让程序充分利用计算机资源,加快程序的响应速度(耗时时间,web服务器压力等等),简化异步事件的处理。
三、使用场景
1、任务会阻塞线程,导致后续的代码不能执行的情况
2、任务执行的时间过长,但是任务可以拆分成多个子任务的情况。
3、任务本身需要协调的执行,比如生产者消费者等问题
四、上下文切换
上下文切换:cpu为线程分配了时间片,时间片非常的短(毫秒),cpu不停的切换线程执行,在切换线程之前会保存上一个任务的线程状态,方便切换回这个线程时,加载这个线程的状态。
频繁的进行上下文切换,会带来一定的性能问题,增大性能的开销。
五、减少上下文切换的开销
1、无锁并发编程:当多线程竞争锁时,会引起上下文的切换,所以多线程处理数据时,可以用一些方法避免使用锁,如将数据的id按照hashmap取模分段,不同线程处理不同段的数据(CurrentHashmap)
2、CAS:java的atomic包使用的是cas算法来更新数据,不需要加锁。
3、使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,会导致大量的线程进入等待状态。