首页 > 代码库 > 第一课 前言
第一课 前言
1、同步(synchronous)和异步(asynchronous)
同步和异步是对方法的调用而言的
同步:提交请求->等待服务器处理->处理完毕返回 ; 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这时候浏览器仍然可以作其他事情)->处理完毕
(异步调用方法后返回很快,这个时候后台会启动一个线程,而接下来的任务会由这个线程去做)
2、并发和并行
并行:是指两个线程(或进程)在同一时刻发生 (多个CPU的情况下)
并发:指两个或多个事件在同一时间间隔内发生(如一个线程一会做一件事情,一会又做另一件事情) 例如:单个CPU
3、临界区
临界区用来表示一种公共的资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程想要使用这个资源,就必须要等待;
进程 --> 进入区(申请资源,资源被占有的话,暂时就不能访问,需要进入阻塞等待队列) --> 临界区 --> 退出区(释放资源)
临界区需要被控制,不希望多个线程同时进入临界区把我的数据破坏掉,希望一次只有一个线程进入,等它释放完锁之后,其他线程才能进来;
4、阻塞 和 非阻塞
阻塞和非阻塞 通常来形容多线程间的相互影响,比如一个线程占用了临界区资源,那么其他的所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不会工作。
(阻塞效率都不会很高)
非阻塞允许多个线程同时进入临界区,只要保证不改数据就可以了
5、死锁 Deadlock、饥饿 Starvation、和活锁 Livelock
死锁:
饥饿:是指某一个或多个线程因为种种原因而无法获得所需要的资源,导致一直无法进行。
如:线程优先级很低,调度一直调度不到你;或者在数据竞争的时候,总是失败。
活锁:
(1)如:电梯遇到人,我要出来,他要进来,我往左边靠让路,他往右边靠让路,结果我进不来他出不去,我又往右靠让路,他往左靠让路,结果是又是我也出不去,他进来;一直这样就是活锁;
(2)在程序中,两个线程都需要资源 A和B资源, C线程持有A资源,D线程持有B资源,然后他们获得不到彼此的资源后就释放了手里面的资源,然后C获得了B资源,D获得了A资源,就这么周而复始的,线程就出去活锁的状态,获得想对于死锁而言要更难排查,因为活锁是动态的。
6、并发级别
阻塞:当一个线程进入临界区,其他线程就必须在临界区外面等待;
非阻塞:无障碍、无锁、无等待
6.1 无障碍:
无障碍是一种最弱的费阻塞调度
自由出入临界区
无竞争时,有限步内完成操作
有竞争时,回滚数据
6.2 有锁
是无障碍的(都可以进入临界区的)
保证有一个线程可以胜出(这就保证了在临界区所有的线程都会顺利的出去)
6.3 无等待(并行最高级别的了,不会总线程待在临界区里面)
无锁的(都可以进入临界区的)
要求所有的线程都必须在有限步内完成
无饥饿的
第一课 前言