一. Java并发和多线程简介

2019-02-27  本文已影响0人  shallowinggg

Java并发是一个涉及了java平台上多线程(MultiTheadings)、并发(Concurrency)和并行(Parallelism)的术语,包括了并发组件、问题和解决方案。这个Java并发指导涉及了多线程、并发构造、并发问题、多线程的代价和好处的核心思想。

并发的简明历史

在过去,计算机只拥有一个CPU,并且在同一时间只能执行一个程序。后来多任务到来,意味着计算机可以在同一时间执行多个程序(也就是任务或进程)。这并不是真正意义上的同一时间。唯一一个CPU在多个程序中共享,操作系统将在程序运行时进行挑选,每个程序可以执行一段时间。
多任务到来的同时,软件开发人员也有了新的挑战。程序不再能够拥有全部的CPU时间,内存以及其他计算机资源。一个好的程序应当释放所有的资源当它不使用的时候,此时其他程序可以使用它们。
再往后多线程到来,意味着你可以在同一个程序中执行多个线程。线程执行可以被视作一个CPU执行程序。当你有多个线程执行同一个程序时,像是有多个CPU执行这个程序。
多线程是一种不错的方式,用来提高某些类型的程序性能。但是多线程比起多任务有着更多的挑战。多个线程在同一个程序中执行,因此它们同时读写同一块内存。这会导致一些不会出现在单线程程序中的错误。因为在单CPU机器中两个线程不会真正的同时执行,所以一些错误不会出现在其中。然而现代计算机有着多个CPU核心甚至多个CPU,这意味着不同的线程将会在不同的核心或者CPU中同时执行。


java-concurrency-tutorial-introduction-1.png

如果一个线程读取某一块内存,同时另一个线程写此块内存,第一个线程最终会读取什么值呢?旧值?第二个线程写入的值?或者两者混合的值?如果两个线程同时向一块内存写入值,当它们完成时最终会留下什么值?第一个线程写的值?第二个线程写的值?或者两者混合的值?
没有合适的预防措施这些结果都是可能的,这个行为甚至是无法预测的,在不同的时间可能会出现不同的结果。因此对于开发者来说采取正确的预防措施是很重要的,这意味着我们需要学习如何控制线程获取共享资源,例如文件,内存,数据库等。这也是这个教程所定位的一个话题。

Java中的并发和多线程

Java是首批让开发者能够容易使用多线程的语言。Java在很早期的时候就拥有了多线程的特性。因此,Java开发者经常面对上面提到的问题,这也是我写这篇并发教程的原因。作为我自己的笔记,其他Java开发者也会从中获取好处。
这个教程主要关注Java中的多线程,但是发生在多线程中的一些问题和多任务以及分布式系统中的问题相似。对于多任务和分布式系统的引用也可能出现在这个教程中。因此“并发”一词并非是“多线程”。

2015及以后的Java并发

自从第一本Java并发书籍发行后,甚至自从Java 5提供的并发组件被推行后,世界上的并发架构和设计已经发生了很大的变化。
新的,异步的的“shared-nothing”平台和像Vert.x,Play/Akka和Qbit之类的APIs已经出现。这些平台使用和标准Java/JEE不一样的线程并发模型,共享内存和锁。新的非阻塞并发算法已经推行,并且新的非阻塞组件如LMax Disrupter已经增加到了我们的工具包中。新的函数式并行编程已经在Java 7的Fork and Join框架和Java 8中的集合streams API中出现。
随着这些新的技术发展,我更新了这个Java并发教程。因此,这个教程能够再次有用。

Java并发学习指导

如果你刚接触Java并发,我建议你可以跟随下面的学习计划学习。

以下链接为原版英文网站,后续文章将会翻译其中内容并且与Java并发编程的艺术一书内容结合,英文较好的人可以直接查看原网站。

并发和多线程基础理论:

Java并发基础:

Java并发中的常见问题:

帮助处理上面问题的Java并发构造:

更深入的话题:

上一篇下一篇

猜你喜欢

热点阅读