并发编程
在讲解并发编程之前,必须理解 “串行”、“并行”、“并发” 的区别。
-
串行:顺序执行;只有在一个线程被一个 CPU 执行完毕后,另一个线程才可以被这个 CPU 执行。
-
并行:同时执行;多个 CPU 同时执行多个线程。
-
并发:穿插执行;一个 CPU 在不同的时间段执行不同的线程,也就是说多个线程轮流穿插着被执行。
为了方便理解,使用如图21.1所示的示意图展示 “串行”、“并行”、“并发” 的区别。
所谓并发编程,指的是让一个 CPU 在某一个时间段内执行一个含有多个线程的程序,其中这些线程被这个 CPU 轮流穿插着执行。并发编程的优势在于当一个 CPU 执行含有多个线程的程序时,另一个线程不必等待当前线程被执行完毕后再被执行,进而提高了使用 CPU 的效率。

Figure 1. 图21.1 “串行” “并行” “并发” 的区别
并发编程具有 3 个特性:原子性、可见性和有序性。具体如下:
-
原子性。原子性是指在一个操作中,所有的子操作被看作一个整体;这个整体同时全部被执行,或者同时不被执行,并且这个整体在执行过程中,不能被挂起,直到被执行完毕。
-
可见性。可见性是指当一个线程修改了线程共享变量的值时,其他线程能够立即得知这个修改。
-
有序性。有序性是指按照编写代码的先后顺序执行某个程序。但是,为了提高性能,编译器和 CPU 可能不会保证代码的执行顺序与代码的编写顺序的一致性;Java 把这种情况称作 “指令重排”。
那么,为什么要学习并发编程呢?由于大数据时代的到来,使得高并发在程序开发过程中成为了常态。此外,并发编程也成为了程序开发人员的硬性要求。