Java 并发 / 多线程教程

Java 并发 / 多线程教程

原文链接:http://tutorials.jenkov.com/java-concurrency/index.html

内容列表

  • Java 中的多线程和并发
  • Java 并发 2015 和展望

最开始的计算机只有一个 CPU ,一次也只能执行一个程序。后来,出现了多任务操作系统,在宏观上能同时执行多个程序。实际上,在同一时刻只能执行一个程序,多个程序共享一个 CPU 。操作系统负责这些程序之间的切换过程,所有的程序将会轮流运行。

随着多任务操作系统的出现,软件开发者遇到了新的挑战。程序不再单独占有 CPU 时间、内存和其他计算机资源。一个好的程序应该释放它不再使用的所有资源,这样一来其他程序可以继续使用这些资源。

再后来,出现了多线程程序。在一个程序中,可以执行多个线程。一个线程的执行可以想象成是一个 CPU 执行一个程序。一个程序中有多个线程在执行就像是有多个 CPU 在执行同一个程序一样。

多线程是增加程序性能的一种很好的方式。然而,多线程比多任务更具有挑战性。多个线程在执行同一个程序,他们很可能会同时读或写同一块内存区域。这样一来会导致单线程下不会出现的问题。有些问题可能在单个 CPU 环境下也不会出现,毕竟多个线程不能并行运行。现代计算机,已经出现了多核 CPU 甚至是多 CPUs。这意味着独立的线程可以被独立的核心或者是独立的 CPU 同时执行。

如果一个线程正在读一块内存区域的同时另外一个线程正在往这块内存区域写值,那么这个读线程最终读到的值到底是什么?旧的值?被写线程写入后的值?还是旧的值和被写后的一个混合结果?或者是两个线程往同一块内存区域写值,那么最终被写入内存的结果是什么?被第一个线程写入的值?被第二个线程写入的值?或者是两种值的一个混合结果?

如果没有合适的预防措施,上述的任何一种结果都是可能发生的。多线程的行为甚至是不可预测的。同一个多线程程序多次运行,可能每次运行结果都不同。作为一个程序开发者,知道怎样采取正确的预防措施(意味着学习控制线程怎样来访问共享的资源,比如内存、文件、数据库等,这也是 Java 并发教程要处理的一个主题)是非常重要的。

Java 中的多线程和并发

Java 是最早支持多线程的语言之一,它使得软件开发者开发并发程序更容易。 Java 在设计之初就支持多线程,因此, Java 开发者经常会面对我们刚才在上面描述的那些问题。这也是我编写 Java 并发教程系列的原因,作为自己的一个笔记的同时也希望能帮助到更多的 Java 开发者。

这个系列会主要集中在 Java 多线程上面,但在多线程中出现的一些问题和在多任务、分布式系统出现的问题很相似。所以,这个系列也会涉及一些多任务和分布式系统,因此强调是并发而不是多线程(解释一下,多线程一定是并发执行,但并发执行的不一定是多线程,也有可能是多任务和分布式系统)。

Java 并发 2015 和展望

自从第一批 Java 并发书籍出现以后,甚至是 Java 5 并发工具发布以后,在并发架构和设计领域里发生了巨大的变化。

现在,异步“非共享”平台和 APIs 比如 Vert.x 和 Play / Akka 和 Qbit 已经出现了。这些平台采用的并发模型和标准的 Java / JEE 并发模型并不相同。标准的 Java / JEE 并发模型采用了线程、共享内存和锁。新的非阻塞并发算法已经发布了,而且新的非阻塞工具比如 LMax Disrupter 已经添加到我们的工具包中。新功能并发技术已经在 Java 7 中的 Fork 和 Join 框架中引进了, collection streams API 也已经在 Java 8 中引进了。

随着这些新技术的开发,我会一直更新我的 Java 并发教程了。因此,这个教程会一再更新。一有时间我就会更新、发布新的教程。

Next: 多线程的优势

你可能感兴趣的:(java,多线程,并发,教程)