Java并发编程--基本名词解释

1 概念:

1.1 同步(Synchronous)和异步(Asynchronous)

同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为;

异步方法调用一旦开始,方法调用就会立即返回,调用者可以继续后续的操作。

Java并发编程--基本名词解释

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

并发:多个任务交替执行,多个任务之间也可能是串行的;

并行:多个任务真实的同时执行;真正的并行只可能出现在拥有多个CPU的系统中。

Java并发编程--基本名词解释

1.3 临界区

​ 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但每一次,只有一个线程可以使用它。

1.4 死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

2 并发级别

​ 由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,可以把并发的级别大致分为:阻塞、无饥饿、无障碍、无锁、无等待几种。

2.1 阻塞(Blocking)

​ 一个线程是阻塞的,其他线程释放资源之前,当前线程无法继续执行。使用**synchronized关键字**、重入锁时,得到的就是阻塞的线程。

2.2 无饥饿(Starvation-Free)

​ 如果线程之间有优先级,那么线程调度的时候总会倾向于满足高优先级的线程,即对于同一个资源的分配,是不公平的。(下图五星级表示高优级线程)

Java并发编程--基本名词解释

2.3 无障碍(Obstruction-Free)

​ 一种非常弱的非阻塞调度,不会因为临界区的问题导致一方被挂起。大家可以一起共享数据。如果检测到数据被破坏,无障碍线程立马回滚自己的修改,确保数据安全。

​ 一种可行的五脏爱可以依赖“一致性标记”实现,在操作前和操作后,都读取这个标记,如果一致,则代表资源访问没有冲突。

2.4 无锁(Lock-Free)

​ 无锁的并行都是无障碍的,但无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。

2.5 无等待(Wait-Free)

​ 要求所有线程都必须在有限步内完成,不会引起饥饿问题。

3. 有关并行的两个重要定律

Amdahl定律、Gustafson定律

3.1 Amdahl定律

Java并发编程--基本名词解释

​ 使用多喝CPU对系统进行优化,优化的效果取决于CPU的数量以及系统中的串行化程序的比重。CPU数量越多,串行化比重越低,优化效果越好。

3.2 Gustafson定律

Java并发编程--基本名词解释

如果可被并行化的代码所占的比重足够多的,那么加速比就能随着CPU的数量线性增长。

4. Java内存模型(Jmm)

4.1 指令重排

​ 指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序

​ 指令重拍可以保证串行语义的一致,没有义务保证多线程间的语义也一致。

4.2 Happen-Before原则

​ 程序顺序原则:一个线程内保证语义的串行性;

​ volatile规则:volatile变量的写,先发生于读,保证了volatile变量的可见性;

​ 锁规则:解锁(unlock)必然发生在随后的加锁之前;

​ 传递性:A先于B,B先于C,那么A必然先于C;

​ 线程的start()方法先于它的每一个动作;

​ 线程的所有操作先于线程的终结(Thread.join())

​ 线程的中断(interrupt())先于被中断线程的代码

​ 对象的构造函数执行,结束先于finalize()方法