同步与异步,阻塞和非阻塞

以前看了不同资料上的各种版本,总结一下自己综合起来的理解:

一.同步:从任务的角度出发,在某一个时刻,[一个任务或者说是一个代码块、或对一个数据结构(如一个队列)的访问、修改] ,只由一个线程进行,其他线程需要进行访问或者执行需要等待这个任务先被执行完或者这个资源被占用结束,而这个正在执行该任务的线程,只能执行完这个任务才能执行其他任务,所以就形成了“协同步调”的效果,也就是按顺序执行任务

可以假设对a程序块加锁,从两个角度观察到这种效果:

  1.单线程:线程A只有执行完a才能继续执行b(a->b)

  2.多线程:线程B需要执行a,但只有先阻塞着,等待A执行完a,B才能执行a,再执行b(a->a->b)

二. 异步:从任务的角度出发,多个任务可在同一时刻由不同线程无先后顺序执行,即不对a加锁,B不必阻塞等待A,在A运行a的同时,直接执行a,b。

三.阻塞:从线程的角度出发,假设A线程在请求某一资源a的时候因为B正在占用,所以得不到而出于阻塞等待状态,A等待B线程运行完毕释放资源给A后,A才继续运行。

四.非阻塞:与阻塞相反,A当得不到B的响应或者资源a的时候,不进入阻塞状态,继续执行其他。

总结:同步异步以及阻塞非阻塞的目的都是为了控制程序使其合理的运行和使资源合理的调度。同步和异步是从任务、资源角度控制的(如加锁和不加锁),而阻塞和非阻塞是从线程的角度去控制的(如java里面的trylock()方法,没有获取到锁的话不阻塞进程)。所以当同步的任务遇到非阻塞执行的线程就有同步非阻塞,同理就有同步阻塞,而执行异步任务的线程不会因为异步任务被阻塞。

posted @ 2021-02-18 19:44  SKZB  阅读(46)  评论(0编辑  收藏  举报