同步和异步
同步和异步是针对方法调用而言的
同步是指方法调用会等待方法返回,方法返回后才能继续往下执行。
异步是指方法调用会立即返回,并继续向下执行,但是异步调用立即返回并不表示这个调用请求处理完成,而是会在后台起一个线程去执行。
并行与并发
并行与并发从外在表象上来看都是同时执行的。
并行是指多个线程或者是多个进程同时执行,在单核Cpu上是不可能存在并行的,因为同一时刻单个cpu只能处理一个线程,分时执行。
并发是指多个任务交替使用cpu,同一时刻只能执行一个指令,但是多个线程被快速的轮换执行。
临界区
临界区用来表示一种公共资源或者说是共享数据。可以被多线程使用,但是一次只能一个线程使用它,一旦临界区被占用,其他线程要想使用临界区资源,则只能进入阻塞等待队列。
阻塞与非阻塞
阻塞和非阻塞通常用来形容多线程间的相互影响。
如果一个线程占用了临界区资源,那么其他所有需要这个资源的线程就会在这个临界区的阻塞队列中等待,等待就会导致线程挂起,导致阻塞。如果占用这个临界区资源的线程一直不释放资源,那么所有阻塞在这个临界区的线程都不能进行工作。
而非阻塞是多个线程同时进入临界区。
死锁、饥饿和活锁
死锁是指两个或者多个线程相互持有对方需要的资源,导致这些线程处于等待状态,无法继续前行
- 死锁产生的必要条件
1.互持条件:一个资源只能被一个进程占用
2.请求和保持条件:一个进程因请求被占用的资源发生阻塞时,对已获得资源保持不放
3.不剥夺条件:任何一个资源在没被该进程释放之前,任何其他线程都无法对他剥夺占用
4.循环等待条件:当发生死锁时,所等待的资源必然会形成一个环路。造成永久阻塞。
- 如何解决死锁:
处理死锁的策略一般分为死锁预防、死锁避免和死锁检测和恢复
死锁预防通常是设立一些限制条件,破坏死锁产生的必要条件,避免死锁发生
死锁避免是在动态分配资源过程中,用一些算法防止系统进入不安全状态,从而避免死锁发生
安全状态是指如果系统中存在一个所有的安全序列{p1..pn},当pi所需要的系统资源不超过系统当前剩余资源量与所有pj(j<i)当前占有资源量之和,则说明系统处于安全状态。
死锁检测和恢复是指在死锁发生之前不采取任何措施,只检测当前系统有没有发生死锁,并采取措施解除死锁。