必须知道的几个概念
1.同步(Synchronous)和异步(Asynchronous):同步和异步都是指方法的调用。
# 同步方法:方法调用一旦开始,调用者必须等到方法调用返回后,才能进行后续的操作。
# 异步方法:一旦方法被调用,则立即返回结果,调用者可以立马进行后续操作。异步方法通常会在另外一个线程中去执行,当执行完再来通知调用者。
- 比如,去某个上场买空调,当下下单付完钱,就得一直等着老板给你打包送货,最后把你送回家,这样这次购物的方法调用结束。这就是同步。
- 同样是买空调,这次是在京东上买,当你在网上下完单付完钱,此时商家就会响应你购物成功,接着爱干嘛就干嘛去,当快递到家时,快递员电话通知你拿快递、签收。完事,这就是异步调用。
2.并发(Concurrency)和并行(Parallelism):并发和并行是非常容易 混淆的,他们都表示两个或者多个任务一起执行。
# 并发:偏重于多个任务的交替执行,快速的来回切换,没有做到真正意义上的串行,只是视觉上的并行。
# 并行:多个任务真正的同时执行。
3.临界区:表示一种公共资源或者是共享数据,可以供多个线程使用。但是一次只能有一个线程使用,一旦临界资源被占用,其他的线程就不能使用,必须等待。
4.阻塞(Blocking)和非阻塞(Non-Blocking):通常形容多线程之间的互相影响
# 阻塞:比如一个线程占用了临界资源,其他需要资源的线程就会等待,导致线程挂起,这种情况就是阻塞。
# 非阻塞:与阻塞相反。
5.死锁(DeadLock):是最糟糕的情况,当多个线程都占用了彼此执行需要的资源,造成了循环等待。并且都不肯释放资源。
6.饥饿(Starvation):指某一个或者多个线程因为种种原因无法获得资源,导致一直无法执行。比如线程优先级比较低,高优先级的不断抢占资源。
7.活锁(LiveLock):死锁的反例,如果说死锁是“蛮不讲理的霸道”,那么活锁就是“绅士谦让”,多个线程主动把资源谦让释放给其他的线程使用,导致资源在线程之间不断的跳动,最终没有一个线程都没有正常执行。