前言

Java多线程系列相关的代码示例已经上传到github:
https://github.com/supermao1013/study-demo/tree/master/dalomao-thread

同步和异步

java 多线程及高并发实战 java多线程与高并发_概念


同步:A调用B,B处理完毕后响应给A

异步:A调用B,B先返回给A,然后在后台启动一个新的线程进行处理并行和并发

java 多线程及高并发实战 java多线程与高并发_临界区_02


并行:两个线程同时跑,适合多核CPU,是真正意义上的同时

并发:一个线程分批次跑,适合单核CPU

临界区
临界区用来表示一种公共资源或者说共享数据,可以被多个线程使用。但是每一次,同时只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,必须等待

阻塞和非阻塞
两个都是并发级别的

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界资源,那么其他所有需要这个资源的线程就必须在这个临界区中等待,等待会导致线程挂起,这种情况就是阻塞。此时,如果占用的资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作

非阻塞允许多个线程同时进入临界区,分为如下几种:

  • 无障碍
  • 一种最弱的非阻塞调度
  • 自由出入临界区
  • 无竞争时,有限步内完成操作
  • 有竞争时,回滚数据
  • 无锁
  • 是无障碍的
  • 保证有一个线程可以胜出
  • 无等待
  • 无锁的
  • 要求所有线程必须在有限步内完成
  • 无饥饿的

死锁、饥饿、活锁

  • 死锁:多个线程占用不同资源一直不释放就会导致死锁,阻塞也会导致死锁,死锁是静态的,线程会停止不动,容易排查
  • 饥饿:指某一个或多个线程因为某种原因无法获得所得需要的资源,导致一直无法执行
  • 活锁:A线程占用A1资源,B线程占用B1资源,但是两个线程同时需要A1和B1资源,因此互相谦让,A线程释放掉A1资源,B线程释放掉B1资源。接着,A发现A1和B1同时有了,又开始抢占资源,抢到B1资源,同理B线程抢占到A1资源,结果资源又不全,索性再次全部释放掉,如此反复。。。活锁比死锁更难以调查,因为线程一直在变动