Java并发系列(一):基础概念

目录

一、并发涉及的基本概念

1.几个概念

2.死锁、饥饿、活锁

3.并发的级别

4.Amdahl定律和Gustafson定律

5.Java内存模型(JMM)

二、参考文献


一、并发涉及的基本概念

1.几个概念

同步:调用方法后程序一直等待执行结果返回,无法执行后续操作

异步:调用方法后程序在另一线程执行操作,继续进行后续操作,真实执行结果在未来返回

并行:同时处理,两个CPU在同一时间同时处理

并发:单CPU在一段时间内,按顺序连续做几件事:如ABC

临界区:公共资源或共享数据,可被多个线程访问

阻塞:一个线程占用临界区资源造成其他需要这个资源的线程必须等待,等待会导致线程挂起,这种情况叫阻塞

非阻塞:没有一个线程可以妨碍其他线程的执行,所有线程都会尝试不断前向执行

2.死锁、饥饿、活锁

死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

饥饿:某一个或多个线程因为种种原因无法获得所需要的资源,导致一直无法执行(与死锁相比,在未来某个时间可能解决)

活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开(两个线程主动将资源释放给别人,导致资源不断在两个线程之间跳动,而没有一个线程可以同时拿到所有资源正常执行)

3.并发的级别

1)阻塞:等待资源无法继续执行、悲观策略:认为两个线程很可能冲突

2)无饥饿:锁公平、没有优先级,按照先来后到的顺序执行

3)无障碍:最弱的非阻塞调度、线程不会因为临界区问题导致被挂起,大家一起修改临界区数据、产生冲突则进行回滚确保数据安全

4)无锁:无障碍的、所有的线程都能尝试对临界区进行访问,保证必有一个线程能在有限步内完成操作离开临界区

5)无等待:无锁基础上进一步扩展,所有线程都必须在有限步内完成:典型无等待结构RCU(ReadCopy Update),对数据的读不加控制;循环次数限制不同有:有界无等待、线程数无关的无等待

4.Amdahl定律和Gustafson定律

  有关于并发对程序性能提升多少、是否提升的研究:Amdahl定律和Gustafson定律

1)Amdahl定律:优化效果取决于系统中串行化程序比例(主要)和CPU数量(由于串行比例,不一定有效果);CPU数量越多,串行化比例越低,优化效果越好

加速比=优化前系统耗时/优化后系统耗时(加速比越高,优化效果越好)

Java并发系列(一):基础概念

2)Gustafson定律:串行化比例小,并行化比例大,加速比就是处理器个数

Java并发系列(一):基础概念

3)两者侧重点

Amdahl强调:串行化比例一定,加速比有上限,不管堆叠多少CPU不能突破这个上限

Gustafson关心:可被并行化的代码比例足够大,那么加速比就能随着CPU数量线性增长

5.Java内存模型(JMM)

Java内存模型(JMM):围绕多线程的原子性、可见性和有序性建立(这儿实战Java高并发讲的没有并发编程艺术的好)

原子性:一个操作是不可中断的,即使是多个线程一起执行,一个操作一旦开始,就不会被其他线程干扰(32位操作系统中对64位的long型数据的读写不是原子性的,两个线程同时写入long型数据对其结果有干扰)

可见性:一个线程修改了某一个共享变量的值时,其他线程是否能立即知道这个修改。

有序性:程序并发时,可能进行指令重排,重排后的指令与原指令的顺序未必一致。

 

不能进行指令重排原则:Happen-Before原则

Java并发系列(一):基础概念

二、参考文献

[1] 实战Java高并发:第一章

[2] Java并发编程艺术:第三章