基本概念
同步和异步
- 同步:多线程同步访问,访问共享变量,同时访问同一共享变量。
- 异步:多线程异步访问,可以访问不同的资源
并发和并行
- 并行:多线程同时运行。
- 并发:交替运行
临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区源被占用,其他线程要想使用这个资源,就必须等待。
阻塞和非阻塞
- 阻塞:当一个线程进入临界区后,其他线程必须等待,阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要 这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如 果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
- 非阻塞:非阻塞允许多个线程同时进入临界区
- 无障碍:
- 无障碍是一种最弱的非阻塞调度
- 自由进入临界区:比较乐观,任务一起修改,未必会修改坏同步的数据
- 有竞争,回滚数据(如,线程b发现线程a改了数据,则会重新读取,不断重试)
- 无竞争,在有限步内完成操作
- 无锁:
- 无障碍的
- 保证有一个线程可以胜出
- 无等待:
- 无锁的。
- 要求所有线程在有限步内完成
- 无饥饿的
- 例如:读写线程分离,每个写线程写的原始数据的副本,最后写线程保证一个线程胜出去同步数据
- 无障碍:
锁、饥饿、活锁
- 死锁:用餐问题以及开车问题。
- 饥饿:饥饿是指某一个或 者多个线程因为种 种原因无法获得所 需要的资源,导致 一直无法执行。一般是线程的有线级别设置问题。
- 活锁:两人相向而行,同时让路问题,比较难排查。