Java 并发编程 基础 一

来源:互联网 发布:淘宝商城裂帛 编辑:程序博客网 时间:2024/06/03 22:57

1、同步 和 异步

同步 和 异步描述方法的调用。
同步:方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 串行的进行方法的调用。
异步方法调用更像一个消息传递,一旦方法调用就会立即返回。

2、并发和并行

并发:多个任务交替执行。
并行:多个CPU的系统上,多个CPU同时执行任务。

3、临界区:

用来表示公共资源或者公共数据。可以被多个线程同时使用,但是每一次,只能有一个线程使用它。 可以共享的代码或者资源。

4、阻塞和非阻塞

用来形容多线程间的相互影响。
一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待导致线程挂起,这种情况就是阻塞。

非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有线程都会尝试不断前行。

5、死锁 、 饥饿、 活锁

都属于多线程的活跃性问题。
死锁 两个或者两个以上的线程,由于资源竞争或者彼此通信造成的一种阻塞现象。

饥饿 某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。

活锁 两个任务执行没有阻塞,但在获取的资源的时候彼此“谦让”,而导致无法具备执行的条件。 由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

6、并发级别:

并发级别可以分为如下几类: 阻塞 无饥饿 无障碍 无锁 无等待。

阻塞:一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法执行。
无饥饿: 线程之间是优先级的,那么线程调度的时候,总会倾向于满足高优先级的线程。如果锁是公平,满足先来后到,那么饥饿就不会发生。阻塞有些线程不能执行,无饥饿就是所有的线程都能够执行,阻塞的情况会产生饥饿。

无障碍,是一种最弱的非阻塞调度。两个线程如果是无障碍的执行,那么他们不会因为临界区的问题导致一方被挂起。换言之,大家都可以大摇大摆地进入临界区。如果一起修改共享数据,把数据该坏了怎么办呢?对于无障碍的线程来说,一旦检测到这种情况,他就会立即对自己所做的修改进行回滚。

无锁: 无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证比必然有个线程能够在有限步内完成操作离开临界区。

无等待:要求所有的线程都必须在有限步内完成。

7、原子性 可见性 有序性

原子性:是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦凯斯,就不会被其他线程干扰。

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

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

8、Happen-Before原则:

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

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

锁规则:解锁必然发生在随后的加锁前

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

线程的start方法先于它的每一个动作。

线程的所有操作先于线程的终结。
线程的中断先于被中断线程的代码
对象的构造函数执行、结束先于finalize方法