java高并发程序设计(一)前言及概念
为什么需要并行:
1.摩尔定律的失效,单核CPU性能达到极限,导致现在的CPU普遍是多核,从而不得不使用并行开发。
2.业务模型需要:
并不是 为了提高系统性能,而是确实在业务上需要多个执行单元。
比如http服务器,为每一个Soket连接新建一个 处理线程。
让不同的线程担任不同的业务工作。
简化任务调度。
几个重要概念:
- 同步(synchronous)和异步(asynchronous)
- 并发(Concurrency)和并行(Parallelism)
- 临界区
- 阻塞(Blocking)和非阻塞(Non-Blocking)
- 死锁(Deadlock)、饥饿(Starvation)、和活锁(Livelock)
- 并行的级别
不手写了,贴课程图了
一个线程里, 该方法一直到执行结束才能开始执行下一个方法,这个方法执行过程就叫同步。
一个线程里,该方法的执行的过程交给了另一个线程,并不占用本线程的时间,并马上执行下一个方法,这个过程就叫异步。
两个线程同时执行,这个过程叫并行。
一个线程分时段的调度不同的任务,这个过程叫并发。
死锁指的多个线程之间占用的了相互需要的资源,引起线程堵塞,导致程序无法继续执行。(静态的现象,因为都是卡死的状态,所以不会占用CPU资源。)
活锁指的是多个线程需要占用多个资源,因为该资源被不同线程占用,导致线程无法完成任务,程序就无法执行, 同时他们都在释放自己的资源和占用需要的资源,从而导致程序一直无法正常执行。(非静态现象,一直占用着CPU资源)
阻塞一种悲观的策略,防止多个线程进入临界区导致数据资源损坏。
无障碍允许线程自由进入临界区,宽进严出,出现数据竞争时回滚操作
允许线程自由进入临界区,出现数据竞争时,保证一个胜出
允许线程自由进入临界区,出现数据竞争时,保证线程都必须在有限部数内完成,不会出现饥饿状态,性能是最好的,也是 数据最不安全的。(可以通过算法来解决安全问题,比如给每个线程一个数据副本)
阿姆达尔定律
古斯塔夫定律