并发编程的几个基本概念

同步&异步

同步(Synchronous)

同步方法一旦调用必须等待方法调用返回后才会继续后续行动。

异步(AsyncChronous)

异步调用更像传递一个消息,一旦开始方法调用就会返回,调用者可以进行后续的操作,在java中异步方法异步都会在宁外一个线程中执行,就比如CompletableFutre 的runAsync方法一样。

并发编程的几个基本概念

并发&并行

并发和并行都可以表示两个或者多个任一起执行。

并发

并发是指多个任务交替执行,多个任务还可能串行的执行。

并行

并行是真正意义上的多个任务同时执行。

并发编程的几个基本概念

临界区

表示公共资源或者共享数据能够被多个线程使用,但是每次使用只能有一个线程使用(比如办公室的一个打印机,一次只能给一个人打印文件)。

阻塞&非阻塞

阻塞和非阻塞是指多个线程的相互影响(比如一个线程占用了临界区资源,那么其他需要使用该资源的线程就会被阻塞),而同步和异步是指方法调用。

死锁&饥饿&活锁

死锁、饥饿、活锁都是多线程的活跃性问题。

死锁

线程通常是彼此占用对方需要的锁,但是又不愿意释放自己的锁而导致的。

饥饿

饥饿时指一个或者多个线程一直获取不到需要的资源而无法继续执行(比如一个线程优先级太低,而高优先级的线程不断抢占它的资源,那么低优先级的线程一直无法得到资源进而无法进行后续的工作)。

活锁

多个线程之间相互谦让将资源让给其他线程,大家都在相互谦让导致没有人能够获取到资源。

原子性

是指一个操作时不可中断的,即使在多个线程环境下,一旦一个操作开始,就不会受其他线程的干扰(比如两个线程对一个int i = 0 进行赋值-1或1,不管两个线程如何操作,i的值要么是-1,要么是1)

可见性

可见性是指一个线程修改了某个共享变量,其他线程是否能够立即知道这个修改,对于串行程序不存在这个问题,但是多线程环境就不一样了,(如果CPU1和CPU2 共享一个变量t,那么CPU1会将t缓存到寄存器中,如果CPU2上的某个线程修改了这个变量,CPU1可能无法意识到这个变化依然读取的是cache或者寄存器中的值)

有序性

程序在执行的过程中可能会发生指令重排

进程&线程

进程

比如windows里运行的QQ,微信等程序,他们直接不会共享内存数据

线程

比如QQ可以边视频,边传文件,而传文件和视频就是线程,线程之间是可以共享内存数据的,进程可以看做是线程的容器

参考资源:《实战高并发程序设计》

猜你喜欢

转载自blog.csdn.net/weixin_43030648/article/details/84932257