Java并发/多线程指南

在过去,计算机只有一个CPU,并且同一时刻只能执行一个程序。后来出现了多任务处理,这意味着计算机可以同时执行多个程序(AKA任务或进程)。然而,它并非真正“在同一时间”。单个CPU在程序之间共享。操作系统将在运行的程序之间切换,在切换之前执行每个程序一段时间。

随着多任务处理出现,软件开发人员面临着新的挑战。程序可能不在假设拥有所有可用的CPU时间,也不能假设所有内存或其他计算机资源。一个好的程序应该释放它不在使用的所有资源,因此其他程序可以使用它们。

后来又出现了多线程,这意味着你可以在同一个程序中拥有多个执行线程。执行线程可以被认为是CPU执行程序。当多个线程执行同一程序,就像多个CPU执行在同一个程序中一样。

多线程是提高某些类型程序性能的一个好方法。然而,多线程比多任务更具挑战性能。线程在同一程序中执行,因此同时读写相同内存。这可能导致在单线程中看不到的错误,其中一些错误可能在单个CPU机器上看不到,因为两个线程从未真正“同时”执行。但是,现代计算机配备了多核CPU,甚至还有多个CPU。这意味着可以通过单独的核心或CPU同时执行单独的线程。

Java并发/多线程指南

如果一个线程读一个内存位置同时另一个线程正在写入,那么第一个线程最终会读到什么值?旧值?第二个线程写入的值?或者是两者之间的混合值?或者,如果两个线程同时写入同一个内存位置,当它们写完时会留下什么值?第一个线程写入的值?第二个线程写入的值?或者写入两个值的混合?

没有恰当的预防措施,这些结果都有可能。这些行为甚至无法预测,结果可能会不时发生变化。因此,作为开发人员,了解如何采取正确的预防措施非常重要,这意味着学习如何控制线程访问共享资源像内存、文件、数据库等。这是Java并发教程解决的主题之一。

Java是第一批使开发人员可以轻松使用多线程的语言之一,Java从一开始就具有多线程功能。因此,Java开发人员经常面对上述问题。这是我写这篇关于Java并发文章的原因。作为自己和任何可能从中受益的Java开发人员的笔记。

这篇文章将主要关注Java中的多线程,但是多线程中出现的一些问题类似于多任务处理和分布式系统中出现的问题。因此,在这篇文章中也可能出现对多任务处理和分布式系统的引用。因此“并发”一词而不是“多线程”。

自从第一本Java并发书籍编写以来,甚至自Java5并发实用程序发布以来,并发体系结构和设计领域发生了很多事情。新的、异步的“无共享”平台和API,如Vert.x、Play/Akka和Qbit已经出现。这些平台使用了不同的并发模型相比标准Java/JEE的并发模型线程、共享内存和锁。新的非阻塞并发算法已经发布,并且我们的工具包中添加了新的非阻塞工具,如LMax Disruptor。Java7 Fork/Join框架以及Java8 中集合流API引入了新的函数式编程并行性。

随着这些新的开发,我现在是时候更新这个Java Concurrency教程了。因此,本教程再次进行中。只要有时间就会发布新的教程。

个人微信公众号,欢迎关注最新动态,期待与您共同学习。

Java并发/多线程指南