java高并发程序设计(一)前言及概念

为什么需要并行:

1.摩尔定律的失效,单核CPU性能达到极限,导致现在的CPU普遍是多核,从而不得不使用并行开发。

2.业务模型需要:

并不是 为了提高系统性能,而是确实在业务上需要多个执行单元。

比如http服务器,为每一个Soket连接新建一个 处理线程。

让不同的线程担任不同的业务工作。

简化任务调度。

几个重要概念:

  • 同步(synchronous)和异步(asynchronous)
  • 并发(Concurrency)和并行(Parallelism)
  • 临界区
  • 阻塞(Blocking)和非阻塞(Non-Blocking)
  • 死锁(Deadlock)、饥饿(Starvation)、和活锁(Livelock)
  • 并行的级别

不手写了,贴课程图了


一个线程里, 该方法一直到执行结束才能开始执行下一个方法,这个方法执行过程就叫同步。

一个线程里,该方法的执行的过程交给了另一个线程,并不占用本线程的时间,并马上执行下一个方法,这个过程就叫异步。


两个线程同时执行,这个过程叫并行。

一个线程分时段的调度不同的任务,这个过程叫并发。


死锁指的多个线程之间占用的了相互需要的资源,引起线程堵塞,导致程序无法继续执行。(静态的现象,因为都是卡死的状态,所以不会占用CPU资源。)

活锁指的是多个线程需要占用多个资源,因为该资源被不同线程占用,导致线程无法完成任务,程序就无法执行,  同时他们都在释放自己的资源和占用需要的资源,从而导致程序一直无法正常执行。(非静态现象,一直占用着CPU资源)

阻塞一种悲观的策略,防止多个线程进入临界区导致数据资源损坏。

无障碍允许线程自由进入临界区,宽进严出,出现数据竞争时回滚操作

允许线程自由进入临界区,出现数据竞争时,保证一个胜出

允许线程自由进入临界区,出现数据竞争时,保证线程都必须在有限部数内完成,不会出现饥饿状态,性能是最好的,也是 数据最不安全的。(可以通过算法来解决安全问题,比如给每个线程一个数据副本)

阿姆达尔定律

古斯塔夫定律