实战Java高并发程序设计之概念

时间:2021-04-15 23:49:33

学习高并发你必须知道的几个重要的概念:

1. 同步(synchronous)和异步(asynchronous)

实战Java高并发程序设计之概念

实战Java高并发程序设计之概念

同步和异步是对方法的调用而言的:

同步调用时,会等待调用的方法完成以后才能继续执行这个方法。

异步调用的时候会瞬间的返回,但是并不是表示这个请求已经完成了,但是会在后台起一个线程去执行接下来的任务


2.并发(Concurrency)和并行(Parallelism)

实战Java高并发程序设计之概念

实战Java高并发程序设计之概念

外在表象是一致的,一般不用去区分。

并行:两个进程或者线程同时在执行

并发:一会做这一回做那,有个调度的过程。

单cpu只能并发,多cpu可并行


3.临界区

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

实战Java高并发程序设计之概念实战Java高并发程序设计之概念

4. 阻塞(Blocking)和非阻塞(Non-Blocking)

– 阻塞和非阻塞通常用来形容多线程间的相互影响。

比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。

此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
– 非阻塞允许多个线程同时进入临界区

-- 阻塞的性能一般来说不是太好。


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

死锁:例如下面下面四辆小车,相互占用道路D-C-B-A-D,而导致大家都不能走,就发生了死锁。除非把一个挪走~

实战Java高并发程序设计之概念实战Java高并发程序设计之概念

活锁:电梯遇人。面对面,你往左让路,他往右让路,还是堵着。一直让一直堵

动态的,比死锁更麻烦


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


6. 并行的级别

实战Java高并发程序设计之概念

6.1 阻塞
当一个线程进入临界区后,其他线程必须等待


6.2 无障碍(Obstruction-Free)
– 无障碍是一种最弱的非阻塞调度
– *出入临界区
– 无竞争时,有限步内完成操作
– 有竞争时,回滚数据

假设有10个线程进入了临界区,如果他们相互干扰,就会存在都出不鸟临界区,最后导致数据回滚.


6.3无锁(Lock-Free)
– 是无障碍的
保证有一个线程可以胜出

无锁在无障碍的基础上增加了:保证有一个线程可以胜出,十个线程的时候保证一个可以胜出,胜出一个以后,9个线程里也必然有一个能胜出,如此循环,最后都抢到资源执行完成.

无锁的代码:

while (!atomicVar.compareAndSet(localVar, localVar+1)) 
{
localVar = atomicVar.get();
}

6.4无等待(Wait-Free)
– 无锁的
要求所有的线程都必须在有限步内完成
任何线程都能无障碍进入临界区,并且能在有限步内完成操作,离开临界区.使得系统运行流畅

无饥饿的

并行的*别


7.有关并行的2个重要定律

不是很懂.以后懂了在补充