Java并发编程之并发工具

前言

《On Java 8》一书中,作者 Bruce Eckel 提出了并发编程的 5 个步骤:

  1. 不要使用它。想一些其他方法来使你写的程序变得更快。
  2. 如果你必须使用它,请使用在 并发编程 - parallel Streams and CompletableFutures 中展示的现代高级工具。
  3. 不要在任务间共享变量,在任务之间必须传递的任何信息都应该使用 Java.util.concurrent 库中的并发数据结构。
  4. 如果必须在任务之间共享变量,请使用 java.util.concurrent.atomic 里面其中一种类型,或在任何直接或间接访问这些变量的方法上应用 synchronized。当你不这样做时,很容易被愚弄,以为你已经把所有东西都包括在内。说真的,尝试使用步骤 3。
  5. 如果步骤 4 产生的结果太慢,你可以尝试使用 volatile 或其他技术来调整代码,但是如果你正在阅读本书并认为你已经准备好尝试这些方法,那么你就超出了你的深度。返回步骤 1 。

看了以上的描述,是不是觉得,即使是 Java 并发编程的大佬,也一再劝我们避免编写并发代码。

阅读更多

聊聊并发和并发模型

问题的来源

以前的计算机都只有一个 CPU, 并且一次只能执行一个程序。后来出现了 多任务(multitasking) 使得计算机可以同时执行多个程序,但这并不是真正的“同时”,只是把 CPU 分成多个时间片,由操作系统去调度切换。再之后出现了 多线程(multithreading) 使得在一个程序里面可以同时执行多个控制流,就像你有多个 CPU 在执行同一个程序一样。在单 CPU 的计算机中,多线程的“同时”并不是“同时”,但现代计算机一般都是多核 CPU,不同的线程可以被不同的 CPU 核心同时执行,是真正的同时。

multithreading

如果一个线程在读一块内存区域的同时,另一个线程在往里面写,那么这块区域的值是什么?或者两个线程同时写一块内存区域,它的值又是什么?假如我们没有对这些可能出现的结果进行防范,那么结果将是不可预测的。什么情况都可能发生。因此,我们需要在一些共享资源上做一些措施,例如内存、文件、数据库等。

阅读更多