操作系统——同步vs异步-阻塞vs非阻塞


同步与异步

  • 同步与异步关注的是消息通信机制被调用者是否有回传功能在任务结束时通知调用者

    同步

  • 同步:就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了
    • 比如写一个函数调用另一个函数,必须等待返回结果才继续下一步骤,因为同步调用是被调用者没有回调通知的功能,所以必须等

异步

  • 异步调用在发出之后,这个调用就直接返回了,所以没有返回结果
  • 调用者不会立刻得到结果,被调用者完成工作后会通知调用者【通过回调函数等方式】
  • 比如在Future和Callable配合使用时
    • 调用者可以启动Callable对应的线程执行任务,然后马上返回,获取到一个Future对象
    • Callable完成工作后,会将返回值存放到Future【相当于一个回调】
    • 调用者可以通过检查Future对象,调用其.get()方法得到返回值
      • 【如果没有返回的话,会被阻塞,但是启动任务和调用get()期间,调用者是可以做自己的事情的,所以是异步非阻塞调用,然后get()阻塞式接受结果】

区别分析

阻塞与非阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态被调用者是否被阻塞

    阻塞

  • 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    • 如果被调用者没有完成工作,就一直等待

非阻塞

  • 非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
    • 如果被调用者还没有完成工作,就返回默认值

区别分析

写在最后

  • 同步一般伴随着阻塞,因为同步时不等待的话拿不到结果
    • 没见过同步的非阻塞是调用,除非是不需要结果的调用,只是为了发送一个通知给被调用者
  • 异步一般伴随着非阻塞,不然就浪费了异步的功能
    • 异步调用后可以选择两种调用拿到结果
      • 阻塞式get + 轮训
      • 阻塞式get