1.并发
并发:英文名Concurrent,简单来说并发就是同一个时刻一个CPU能处理的任务的数量;
注意:这里需要强调的是并发一定是指单个CPU上处理多个任务的能力。
举个生活中的栗子:
培训机构有四个班级,在大厅放置了一台饮水机,这台饮水机同时给四个班级的学生供水。那么这台饮水就同时能够处理四个班级学生饮水的任务,我们就可以理解为并发。
并发由于只有一个CPU,因此在宏观上看是并行的(多个任务轮流执行),但是在微观上是串行的(一次只能处理一个任务)。
2.并行
并行:英文Parallel,是指在多个处理器上同时执行多个进程(任务)。
举个生活中的栗子:
培训机构有四个班级,在每个班级里面都放了一台饮水机供班级的学生饮水。那么我们可以理解为每台饮水机就是一个CPU,四个班级同时有四台饮水机处理每个班级学生饮水的任务。
3.多线程与并发并行的关系
多线程是实现并发的一种手段,但是多线程也有可能是并行,这取决于这个多线程程序是运行在单核CPU还是多核CPU上,如果这个多线程仅仅是运行在单核CPU上,那么每个线程就是并发,如果运行在多核CPU上那么有可能就是并行。

3.同步
同步:英文synchronous,进程之间存在依赖和协作的关系;
具体个生活中的栗子:
老张爱喝茶,所以经常烧开水泡茶。老张把水壶放到灶台,一直等着水烧开,然后开始泡茶。
时间长了,老张觉的自己有点傻!
4.异步
异步:英文asynchronous,进程与进程之间是彼此独立,简单说就是个做个的事情。
具体个生活中的栗子:
老张爱喝茶,所以经常烧开水泡茶。这次老张聪明了,从市场买回来一个水烧开后会自动响笛的水壶。
老张把水壶放到灶台,回客厅看电视了,什么时候水壶响了,去厨房接水泡茶。
这里也许有小伙伴要问,并发和异步有什么区别呢?
并发强调的是多个任务 “同时” 执行(不论是真同时,还是感觉上同时),但是异步并不强调 “同时”,而是强调各自独立执行,不关心对方的执行结果。
例如,正在被CPU执行的任务一可以被任务二打断,在并发环境下,任务二的时间片用完后,就必须将CPU交给任务一了,任务一继续被执行,任务一时间片用完后,就需要把CPU交给任务二了,这样快速交替下去,让人感觉,这两个任务似乎在同时执行;而在异步下,任务二在打断任务一后,可以一直被执行下去,不用考虑是否做到了两个任务同时执行。
5.同步异步与阻塞非阻塞
在同步与异步操作中,如果涉及到IO,文件等比较耗时的操作,就会出现阻塞或者非阻塞的问题。
我们还是以老张烧水泡茶为例。
烧开水就是一个比较耗时的操作,等同于程序中的IO操作。于是发明了带响笛和不带响笛的水壶,用不带响笛的水壶烧水就是阻塞方法,用带响笛的水壶烧开水就是非阻塞方法。
出现阻塞的情况有以下两种:
以上两种情况,显得老张不聪明,但是老张明白一个道理,这样虽然苯,但是我肯定能喝上开水。
出现非阻塞的情况有以下两种: - 老张把普通水壶放到灶台,然后回客厅看电视,时不时跑到厨房看看水烧开了没有。(同步非阻塞) - 老张把带响笛水壶放到灶台,然后回客厅看电视,什么时候水壶响了,去厨房接水泡茶。(异步非阻塞)
老张突然觉得自己聪明了,但是万一水壶不响了,老张就泡不上茶了!
总结:异步效率高,但是可靠性低。同步效率低,可靠性高。
6.多线程与同步异步的关系
多线程是实现同步和异步的一种手段而已,即便不使用多线程,单线程本身就是同步的。当然实现异步不仅仅可以使用多线程,定时器,事件驱动和单线程也可以异步了。只不过事件驱动的兼容性,还有支持的程度是有限的。
简单说多线程和同步和异步之间没有必然的关系,如下图:

6.小结