高并发编程在软件开发中具有非常重要的作用,它是微观上的性能调优,
首先并发是一个处理器同时处理多个任务
并行是多个处理器或者是多核的处理器同时处理多个不同的任务
同步是执行某个操作开始后就一直等着按部就班的直到操作结束
异步是执行某个操作后立即离开,后面有响应的话再来通知执行者
临界区是公共资源或者共享数据,由于共享数据的出现,必然会导致竞争。
阻塞是某个操作需要的共享资源被占用了,只能等待,称为阻塞
非阻塞是某个操作需要的共享资源被占用了,不等待立即返回,并携带错误信息回去,期待重试
如果两个操作都在等待某个共享资源而且都不退让就会造成死锁:
而活锁是相互谦让而导致阻塞无法进入下一步操作,跟死锁相反,死锁是相互竞争而导致的阻塞
并发级别在理想的情况下我们希望所有线程都一起并行飞起来,但是CPU数量有限,线程源源不断,总得有个先来后到,不同场景需要的并发需求也不一样,比如秒杀系统我们需要很高的并发程度,但是对于一些下载服务,我们需要的是更快的响应,并发反而是其次的。所以我们也定义了并发的级别,来应对不同的需求场景。
-
阻塞:阻塞是指一个线程进入临界区后,其它线程就必须在临界区外等待,待进去的线程执行完任务离开临界区后,其它线程才能再进去。
-
无饥饿:线程排队先来后到,不管优先级大小,先来先执行,就不会产生饥饿等待资源,也即公平锁;相反非公平锁则是根据优先级来执行,有可能排在前面的低优先级线程被后面的高优先级线程插队,就形成饥饿
-
无障碍:共享资源不加锁,每个线程都可以自有读写,单监测到被其他线程修改过则回滚操作,重试直到单独操作成功;风险就是如果多个线程发现彼此修改了,所有线程都需要回滚,就会导致死循环的回滚中,造成死锁
-
无锁:无锁是无障碍的加强版,无锁级别保证至少有一个线程在有限操作步骤内成功退出,不管是否修改成功,这样保证了多个线程回滚不至于导致死循环
-
无等待:无等待是无锁的升级版,并发编程的最高境界,无锁只保证有线程能成功退出,但存在低级别的线程一直处于饥饿状态,无等待则要求所有线程必须在有限步骤内完成退出,让低级别的线程有机会执行,从而保证所有线程都能运行,提高并发度。