同步,异步,阻塞,非阻塞及并发编程概念

本文通过生动的故事和清晰的例子,详细解释了同步、异步、阻塞和非阻塞的概念,以及它们在多线程环境中的应用。文章还探讨了并发与并行的区别,以及死锁、饥饿和活锁等多线程问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://www.jianshu.com/p/d945aefa73fa
这是一边通俗易懂,深刻全面说了 同步,异步,阻塞,非阻塞 概念的文章,值得阅读!!
1.基本概念
引子
以ajax为例: 异步就是不等待结果的代码, 异步并不是同时做两件事情

#结果打印顺序是 1,3,2

"
之所以会是这样是因为:
异步代码不等待结果,直接进行下面的代码,
所以定时器只是开启了,而没有立即执行里面的代码,
等到当前运行坏境的代码执行完之后再回来执行定时器里面的代码。
"

定时器里面的代码一定会在当前环境中的任务执行完了「之后」才执行。
所以并不是同时在做两件事。

一个小故事:小A烧开水。
出场人物:小A出场道具:普通水壶(放在煤气灶上的那种,为了方便简称:水壶);会响的水壶(水烧开了会响的那种,简称:响壶)。故事目的:小A要拿开水泡咖啡

小A为了实现目的,指定了4个计划:

#1、同步阻塞
用水壶烧水,并且站在煤气灶旁边,啥事不干,两眼直勾勾的盯着水壶,等水烧开。
烧开后就去泡咖啡。

假设烧水和泡咖啡是在同一个线程中执行。

#2、同步非阻塞
仍然用水壶煮水,不过此时不再傻傻得站在那里看水开没开,
而是去玩局LOL,每当自己死了,就过来看看水开了没有。
如果水开了就去泡咖啡。

假设这里玩LOL,是另一个线程运行的。

#3、异步阻塞
动用响壶烧水,仍然站在煤气灶旁边,不过此时不两眼直勾勾的盯着壶了,而是听响,
因为响壶水开时会用响声通知小A。

#4、异步非阻塞
在计划3的基础上,小A不站在煤气灶旁边了,而是去玩局LOL,
等听到响壶的声音提醒后,再去跑咖啡。

1.1同步,异步,阻塞,非阻塞
同步和异步关注的是结果消息的通信机制:
同步:调用方需要主动等待结果的返回。
异步:不需要主动等待结果的返回,而是通过其他手段,比如状态通知,回调函数等。

阻塞和非阻塞主要关注的是等待结果返回调用方的状态:
阻塞:是指结果返回之前,当前线程被挂起,不做任何事。
非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。

其实,这两者存在本质的区别,面向的对象是不同的。

#阻塞/非阻塞:
进程/线程需要操作的数据如果尚未就绪,是否妨碍了当前进程/线程的后续操作。

#同步/异步:
数据如果尚未就绪,是否需要等待数据结果。

#异步编程的难点
(java8的CompleteFuture是异步编程的亮点)

  1. 如何优雅地实现异步编程一直都是一个难题,异步编程的通常做法就是采用callback的方法,
    但是这种方法通常会把代码嵌套在正常流程的代码中,而且当有多层嵌套的时候代码更加难以维护。

  2. 异步编程的异常处理也是难以维护,
    在Java中,异步编程通常由新的线程完成,而子线程的异常是无法在父线程捕获的,
    那么对于异步执行结果的获取就需要付出更大的代价,比如通过:轮询、事件驱动等来完成。

1.2并发&并行
并发和并行都可以表示两个或者多个任一起执行。

#并发
并发是指多个任务交替执行,多个任务还可能串行的执行。

#并行
并行是真正意义上的多个任务同时执行。

1.3死锁&饥饿&活锁
死锁、饥饿、活锁都是多线程的活跃性问题。

#死锁线程
通常是彼此占用对方需要的锁,但是又不愿意释放自己的锁而导致的。

#饥饿
是指一个或者多个线程一直获取不到需要的资源而无法继续执行
(比如一个线程优先级太低,而高优先级的线程不断抢占它的资源,
那么低优先级的线程一直无法得到资源进而无法进行后续的工作)。

#活锁
多个线程之间相互谦让将资源让给其他线程,大家都在相互谦让导致没有人能够获取到资源。

1.4原子性, 可见性, 有序性
#原子性
是指一个操作是不可中断的,即使在多个线程环境下,一旦一个操作开始,就不会受其他线程的干扰
(比如两个线程对一个int i = 0 进行赋值-1或1,不管两个线程如何操作,i的值要么是-1,要么是1)

#可见性
是指一个线程修改了某个共享变量,其他线程是否能够立即知道这个修改,
对于串行程序不存在这个问题,但是多线程环境就不一样了,
(如果CPU1和CPU2 共享一个变量t,那么CPU1会将t缓存到寄存器中,
如果CPU2上的某个线程修改了这个变量,CPU1可能无法意识到这个变化依然读取的是cache或者寄存器中的值)

#有序性程序
在执行的过程中可能会发生指令重排

作者:suxin1932
链接:https://www.jianshu.com/p/d945aefa73fa
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值