1 / 29
文档名称:

java 和 scala 并发性基础.doc

格式:doc   大小:32KB   页数:29页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

java 和 scala 并发性基础.doc

上传人:wo1230 2017/4/23 文件大小:32 KB

下载得到文件列表

java 和 scala 并发性基础.doc

相关文档

文档介绍

文档介绍:————————————————————————————————————————————————————— Java 和 Scala 并发性基础处理器速度数十年来一直持续快速发展, 并在世纪交替之际走到了终点。从那时起, 处理器制造商更多地是通过增加核心来提高芯片性能, 而不再通过增加时钟速率来提高芯片性能。多核系统现在成为了从手机到企业服务器等所有设备的标准, 而这种趋势可能继续并有所加速。开发人员越来越需要在他们的应用程序代码中支持多个核心,这样才能满足性能需求。在本系列文章中, 您将了解一些针对 Java 和 Scala 语言的并发编程的新方法,包括 Java 如何将 Scala 和其他基于 JVM 的语言中已经探索出来的理念结合在一起。第一期文章将介绍一些背景, 通过介绍 Java 7和 Scala 的一些最新技术,帮助了解 JVM 上的并发编程的全景。您将了解如何使用 JavaExecutorService 和 ForkJoinPool 类来简化并发编程。还将了解一些将并发编程选项扩展到纯 Java 中的已有功能之外的基本 Scala 特性。在此过程中, 您会看到不同的方法对并发编程性能有何影响。后续几期文章将会介绍 Java 8 中的并发性改进和一些扩展,包括用于执行可扩展的 Java 和 Scala 编程的 Akka 工具包。 Java 并发性支持在 Java 平台诞生之初, 并发性支持就是它的一个特性, 线程和同步的实现为它提供了超越其他竞争语言的优势。 Scala 基于 Java 并在 JVM 上运行,能够直接访问所有 Java 运行时(包括所有并发—————————————————————————————————————————————————————性支持)。所以在分析 Scala 特性之前, 我首先会快速回顾一下 Java 语言已经提供的功能。 Java 线程基础在 Java 编程过程中创建和使用线程非常容易。它们由 类表示, 线程要执行的代码为 实例的形式。如果需要的话, 可以在应用程序中创建大量线程, 您甚至可以创建数千个线程。在有多个核心时, JVM 使用它们来并发执行多个线程;超出核心数量的线程会共享这些核心。线程操作的协调难以让人理解。只要从程序的角度让所有内容保持一致, Java 编译器和 JVM 就不会对您代码中的操作重新排序,这使得问题变得更加复杂。例如: 如果两个相加操作使用了不同的变量, 编译器或 JVM 可以安装与指定的顺序相反的顺序执行这些操作,只要程序不在两个操作都完成之前使用两个变量的总数。这种重新排序操作的灵活性有助于提高 Java 性能, 但一致性只被允许应用在单个线程中。硬件也有可能带来线程问题。现代系统使用了多种缓存内存级别,一般来讲,不是系统中的所有核心都能同样看到这些缓存。当某个核心修改内存中的一个值时,其他核心可能不会立即看到此更改。这些线程通过离开自己的 synchronize d 锁来释放该锁之前写入的数据。这种保证既适用于编译器或 JVM 所执行的操作的重新排序, 也适用于硬件内存缓存。一个 synchronized 块的内部是您代码中的一个稳定性孤岛,其中的线程可依次安全地执行、交互和共享信息。—————————————————————————————————————————————————————在变量上对 volatile 关键字的使用,为线程间的安全交互提供了一种稍微较弱的形式。 synchronized 关键字可确保在您获取该锁时可以看到其他线程的存储, 而且在您之后, 获取该锁的其他线程也会看到您的存储。 volatil e 关键字将这一保证分解为两个不同的部分。如果一个线程向 volatil e 变量写入数据, 那么首先将会擦除它在这之前写入的数据。如果某个线程读取该变量, 那么该线程不仅会看到写入该变量的值, 还会看到写入的线程所写入的其他所有值。所以读取一个 volatile 变量会提供与输入一个 synchronized 块相同的内存保证,而且写入一个 volatil e 变量会提供与离开一个 synchronized 块相同的内存保证。但二者之间有很大的差别: volatile 变量的读取或写入绝不会受阻塞。抽象 Java 并发性同步很有用, 而且许多多线程应用程序都是在 Java 中仅使用基本的 synchronized 块开发出来的。但协调线程可能很麻烦, 尤其是在处理许多线程和许多块的时候。确保线程仅在安全的方式下交互并避免潜在的死锁( 两个或更多线程等待对方释放锁之后才能继续执行), 这很困难。支持并发性而不直接处理线程和锁的抽象, 这为开发人员提供了处理