有关并发的概念

1、concurrency vs. parallelism(并发与并行)

这两个的区别在于:并发是指多个任务都在进行,但是他们可能不是同时的,比如有时间片的轮换。并行是指多个任务确确实实同时都在进行。

2、asynchronous vs. synchronous (异步与同步)

方法调用在这种情况下认为是同步的:调用者不能继续执行,直到该方法返回一个值或者抛出一个异常。异步方法调用允许调用者经过有限步骤后继续执行,方法调用结束后通过其他机制通知调用方(比如:回调,消息等)。一个同步的API可能是用阻塞来实现同步的,但是这不是必须的,比如一个CPU密集型的任务也可以有类似于阻塞的行为。

3、Non-blocking vs. Blocking(非阻塞与阻塞)

如果一个线程的延迟(delay)会无限期的延迟其他的线程,我们就说线程发生了阻塞,比如以互斥方式访问共享资源的时候,当一个线程正在访问资源的时候,其他需要访问这个资源的线程就阻塞了,处于停止执行的等待状态。非阻塞就是没有线程可以阻塞其他的线程的执行。

4、Deadlock vs. Starvation vs. Live-lock (死锁,饿死与活锁)

死锁是指参与者中的任何一方都在等待其他一方到达某种状态,自己才能继续执行的现象。死锁与阻塞密切相关,一般由阻塞引起的。

与死锁现象中的所有方都不能执行不同,饿死是指参与者中的一些可以执行,而另外一些永远得不到执行的一种现象。比如基于线程优先级的调度算法,如果写的不好的话,低优先级的线程永远得不到执行。

活锁和死锁的现象一样,都是所有方都不能执行。与死锁不一样的是它产生的原因,活锁是参与各方不停的改变自己的状态,一个例子就是:两个线程都有两个相同的资源可用,每一方都需要请求一个资源,同时判断另一个线程是否也请求该资源,如果是,就去请求另一个资源,这样最坏的情况可能就是两个资源在两个线程之间被踢皮球一样,踢来踢去。

5、Race condition(竞争条件,正确性依靠于事件发生的相对时间或者顺序,是一种需要特别注意的问题)

check-and-act是一种race condition,read-modify-write也是一种race condition 如 i++。一般都要为race condition加锁来避免一些错误。

java中的锁是可重进锁,就是说同一个线程可以多次申请同一个对象的锁,并且获得通过。所以作为对象上的锁不光要记录锁的所有者,还需要锁被同一个所有者引用的次数。

原文地址:https://www.cnblogs.com/winson/p/3230375.html