1.同步和异步
同步代表程序执行一个请求,知道请求完成,再处理下一个请求
异步代表程序执行一个请求,会直接返回,会单独开一个线程让这个请求执行,同时执行下一个请求,并不一定等请求完成再处理下一个请求
![](https://i-blog.csdnimg.cn/blog_migrate/eec6012cd10c50b1f2ffa078a0b1642d.png)
2.并发和并行
![](https://i-blog.csdnimg.cn/blog_migrate/97be6f9a01268a4d0a8e528a14446d71.png)
并行就是多个线程一起进行
并发就是一个线程轮流执行
3.临界区
![](https://i-blog.csdnimg.cn/blog_migrate/e1bffc7149d8ff2fd978cf4a1e50bc1f.png)
4.阻塞和非阻塞
![](https://i-blog.csdnimg.cn/blog_migrate/b93fd71b35532218a9ac4b11707785ab.png)
5.死锁、饥饿、活锁
![](https://i-blog.csdnimg.cn/blog_migrate/beb468d70ff1c5454d0d2b793b74a22c.png)
死锁,就是指线程之间相互阻塞,如图中小汽车,A必须等B执行,B必须等C执行完,C必须等D执行完,D又必须等A执行完,这样就变成了死循环,谁都无法获取资源,导致程序停止,这也是静态锁
活锁就像两个人进门,B让的时候A也让,B向前的时候A也向前,结果两个都无法通过
6.并发级别
![](https://i-blog.csdnimg.cn/blog_migrate/b35d58a85b3f061de696593ab02e0c9a.png)
1)阻塞:
当一个线程进入临界区的时候其他的线程必须等待当前线程完成以后才能进入
2)无障碍:
无障碍是一种非常弱的非阻塞调度
自由出入临界区
当无竞争时,在有限步数内完成操作
在有竞争时,回滚
(比如说A,B同时对一个坐标进行读写操作,A读完X继续读取Y坐标的时候,B对坐标进行改动,A就回滚操作重新读取,因为A默认X可能已经改变了)
3)无锁:(最常见的用法)
具有无障碍的特征
同时确保有一个线程可以胜出也就是执行完成
4)无等待:(最好的情况)
具有无锁的所有特征
要求所有的线程都在有限步数内完成操作
7并行的两个定律 主要用于算加速比
![](https://i-blog.csdnimg.cn/blog_migrate/3cf47be37c3886ef6ae89db023843c3a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/97e38893420bc0fe8ebb5c6262fe0914.png)