Java高并发程序设计——基本概念

Java高并发程序设计——基本概念

一、同步和异步 同步和异步通常用来形容一次方法调用 同步调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 异步方法一旦开始,方法调用就会立即返回,调用者可以继续进行后续的工作,异步方法通常会在另外一个线程中执行。

二、并发和并行 它们都可以表示两个或者多个任务一起执行,但是有区别。 并行的多个任务是同时执行,而并发是交替执行

三、临界区 临界区用来表示一种公共资源或者共享数据,可以被多个线程使用。但是每一次只能由一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源就必须等待。

四、阻塞和非阻塞 当一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在临界区中等待,这就会导致线程挂起,称为阻塞。 非阻塞允许多个线程访问临界区,强调没有一个线程可以妨碍其他线程执行,所有线程都会尝试不断向前执行。

五、死锁、饥饿、活锁 死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 活锁表示线程主动将资源放给其他线程,导致资源不断在两个线程间跳动,而没有一个资源可以同时拿到所有资源正常执行。 饥饿是指一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。例如线程优先级太低。

六、并发级别 并发级别有5种,分为阻塞、无饥饿、无障碍、无锁、无等待。 1、阻塞。一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。 2、无饥饿(Starvation-Free)。所有线程按照先来后到的顺序获得资源。 3、无障碍(Obstruction-Free)。多个线程可以同时访问临界区。一旦发生数据错误,相应线程会立即对自己所做的修改进行回滚,确保数据安全。 4、无锁(Lock-Free)。无锁的并行都是无障碍的,所有线程都可以尝试对临界区访问,且保证一定有一个线程能在有限步中完成操作离开临界区。可能导致饥饿。 5、无等待(Wait-Free)。无饥饿,无锁,要求所有线程在有限步内完成。

七、并行的两个重要定律 F——串行比,n——处理器个数 1、Amdahl定律 加速比=1/(F+(1-F)/n) 2、Gustafson定律 加速比=n-F(n-1)

经验分享 程序员 微信小程序 职场和发展