学习高并发你必须知道的几个重要的概念:
1. 同步(synchronous)和异步(asynchronous)
同步和异步是对方法的调用而言的:
同步调用时,会等待调用的方法完成以后才能继续执行这个方法。
异步调用的时候会瞬间的返回,但是并不是表示这个请求已经完成了,但是会在后台起一个线程去执行接下来的任务
2.并发(Concurrency)和并行(Parallelism)
外在表象是一致的,一般不用去区分。
并行:两个进程或者线程同时在执行
并发:一会做这一回做那,有个调度的过程。
单cpu只能并发,多cpu可并行
3.临界区
用来表示一种公共的资源或者说是共享资源,可以被多个线程使用。但是每次只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。
4. 阻塞(Blocking)和非阻塞(Non-Blocking)
– 阻塞和非阻塞通常用来形容多线程间的相互影响。
比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。
此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
– 非阻塞允许多个线程同时进入临界区
-- 阻塞的性能一般来说不是太好。
5.死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)
死锁:例如下面下面四辆小车,相互占用道路D-C-B-A-D,而导致大家都不能走,就发生了死锁。除非把一个挪走~
活锁:电梯遇人。面对面,你往左让路,他往右让路,还是堵着。一直让一直堵
动态的,比死锁更麻烦
饥饿:是指一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。
6. 并行的级别
6.1 阻塞
当一个线程进入临界区后,其他线程必须等待
6.2 无障碍(Obstruction-Free)
– 无障碍是一种最弱的非阻塞调度
– *出入临界区
– 无竞争时,有限步内完成操作
– 有竞争时,回滚数据
假设有10个线程进入了临界区,如果他们相互干扰,就会存在都出不鸟临界区,最后导致数据回滚.
6.3无锁(Lock-Free)
– 是无障碍的
– 保证有一个线程可以胜出
无锁在无障碍的基础上增加了:保证有一个线程可以胜出,十个线程的时候保证一个可以胜出,胜出一个以后,9个线程里也必然有一个能胜出,如此循环,最后都抢到资源执行完成.
无锁的代码:
while (!atomicVar.compareAndSet(localVar, localVar+1))
{
localVar = atomicVar.get();
}
6.4无等待(Wait-Free)
– 无锁的
– 要求所有的线程都必须在有限步内完成
任何线程都能无障碍进入临界区,并且能在有限步内完成操作,离开临界区.使得系统运行流畅
– 无饥饿的
并行的*别
7.有关并行的2个重要定律
不是很懂.以后懂了在补充