并发编程

在讲解并发编程之前,必须理解 “串行”、“并行”、“并发” 的区别。

  • 串行:顺序执行;只有在一个线程被一个 CPU 执行完毕后,另一个线程才可以被这个 CPU 执行。

  • 并行:同时执行;多个 CPU 同时执行多个线程。

  • 并发:穿插执行;一个 CPU 在不同的时间段执行不同的线程,也就是说多个线程轮流穿插着被执行。

为了方便理解,使用如图21.1所示的示意图展示 “串行”、“并行”、“并发” 的区别。

所谓并发编程,指的是让一个 CPU 在某一个时间段内执行一个含有多个线程的程序,其中这些线程被这个 CPU 轮流穿插着执行。并发编程的优势在于当一个 CPU 执行含有多个线程的程序时,另一个线程不必等待当前线程被执行完毕后再被执行,进而提高了使用 CPU 的效率。

image 2024 03 06 11 56 06 715
Figure 1. 图21.1 “串行” “并行” “并发” 的区别

并发编程具有 3 个特性:原子性、可见性和有序性。具体如下:

  • 原子性。原子性是指在一个操作中,所有的子操作被看作一个整体;这个整体同时全部被执行,或者同时不被执行,并且这个整体在执行过程中,不能被挂起,直到被执行完毕。

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

  • 有序性。有序性是指按照编写代码的先后顺序执行某个程序。但是,为了提高性能,编译器和 CPU 可能不会保证代码的执行顺序与代码的编写顺序的一致性;Java 把这种情况称作 “指令重排”。

那么,为什么要学习并发编程呢?由于大数据时代的到来,使得高并发在程序开发过程中成为了常态。此外,并发编程也成为了程序开发人员的硬性要求。