关于并发的基础概念

最近在阅读《实战Java高并发程序设计》,写一写关于并发的一些理解。

(一)异步和同步

       同步和异步通常用来形容一次方法的调用。

      同步意味着方法一旦调用开始,调用者必须等到方法返回才能进行后续的行为。

      异步调用意味的方法一旦调用就会立即返回,调用者可以立即进行后续的行为,异步调用表现的更像是一个消息传递。但是异步调用会在另一个线程中“真实”执行。如果异步调用需要返回结果,那么当异步调用真实完成时,则会通知调用者。

(二)并发(Concurrency) 和 并行 (Parallelism)

       并发和并行容易混淆。并发偏重于多个任务交替执行,而多个任务之间有可能是串行的。并行则是真正意义上的“同时执行”。如图:

(三)临界区

       临界区表示共享数据或者共享资源,会被多个线程使用的数据。但是每一次只有一个线程可以使用共享数据,一旦临界区资源被占用,其他线程要想使用,只能等占用的线程释放资源。

(四)阻塞和非阻塞

       

(五)死锁、饥饿、活锁

        死锁、饥饿、活锁都是属于多线程的活跃性问题。

  1. 死锁:死锁出现在资源争夺上,线程互相不释放资源,导致线程之间相互等待。
  2. 饥饿:某一个或者多个线程因为种种原因无法获得相关资源,导致一只无法执行。与死锁相比,饥饿还是可能执行的,只是可能等待的时间比较长。

    (1)线程的优先级比较低,而高优先级的线程不断抢占它所需要的资源,导致低优先级的线程无法工作。

    (2)某一个线程一直占着资源不放,导致其他需要该资源的线程无法执行。

  3. 活锁:线程主动释放资源给其他线程使用,但是资源不断的在线程之间跳动,而没有一个线程可以同时拿到所有资源而正常执行。

备注:有问题,请指出,谢谢。

猜你喜欢

转载自blog.csdn.net/tpasta/article/details/81386205