zoukankan      html  css  js  c++  java
  • 同步与异步,阻塞和非阻塞

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

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

    可以假设对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()方法,没有获取到锁的话不阻塞进程)。所以当同步的任务遇到非阻塞执行的线程就有同步非阻塞,同理就有同步阻塞,而执行异步任务的线程不会因为异步任务被阻塞。

  • 相关阅读:
    php echo return exit 区别
    Ubuntu下添加开机启动项的2种方法
    在php中定义常量时,const与define的区别
    yii分页操作
    ubuntu14.04设置静态ip
    Yii IIS8下使用伪静态【Url Rewrite】去掉index.php
    java 第三方库
    IDEA插件
    springboot扫描通用的依赖模块
    idea注册
  • 原文地址:https://www.cnblogs.com/lxl87/p/14413260.html
Copyright © 2011-2022 走看看