Java并发编程之AQS

什么是 AQS

同步工具类 也叫同步器(Synchronizer)。在使用同步器时,我们发现不同的同步器存在许多共同点,例如 ReentrantLock 和 Semaphore 都支持每次允许一定数量线程通过/等待/取消,也都支持让等待线程执行公平或非公平的队列操作等。

事实上,很多同步工具类在实现时都使用了共同的基类,这就是 AbstractQueuedSynchronizer(AQS),抽象队列同步器

阅读更多

Java并发编程之对象共享

对象数据共享

要实现多个线程之间的数据共享,需要考虑两个问题:

  • 通信:通信是指消息在两条线程之间传递
  • 同步:既然要传递消息,那 接收线程发送线程 之间必须要有个先后关系。此时就需要用到同步,即控制多条线程之间的执行次序。
阅读更多

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 并发编程的大佬,也一再劝我们避免编写并发代码。

阅读更多

Java并发编程之安全性

并发编程显然有很多优势,然而,多线程也带来了一定的风险。例如安全性问题、活跃性问题、性能问题等。

  • 安全性问题: 含义是“永远不发生糟糕的事情”,例如多个线程同时修改一个共享变量,导致结果跟预期不符。
  • 活跃性问题: 关注“某件正确的事情最终会发生”,假若不能,就会产生活跃性问题。例如死锁,A、B进程互相等待对方释放某资源,结果谁也执行不下去。
  • 性能问题: 在解决安全性问题和活跃性问题的时候会带来额外开销,我们必须想办法减少开销。

并发编程的问题,在Java简明笔记(十一) 并发编程中就有提及,这一篇,主要就安全性问题,详细谈谈Java并发编程的问题。

阅读更多