在处理器的速度持续快速发展几十年来在世纪之交的结束。自那时以来,处理器制造商提高芯片的性能更加芯通过提高时钟速度比。多核心系统现在为从手机到企业服务器所有的规范,而且这种趋势很可能会继续加快。越来越多,开发商必须解决多核在他们的应用程序代码来满足性能要求。
在本系列文章中,您将看到一些新的方法来并行编程的Java与Scala语言,包括Java是如何将思想已探索Scala和其他基于JVM的语言。这第一部分会给你一个理解的并行编程更广阔的画面在JVM中引入一些为Java 7和Scala当前最先进的技术背景。您将学习如何使用JavaExecutorService和forkjoinpool类来简化并行编程。你也会得到一些扩展并行编程选项在平原Java有什么基本Scala介绍。一路上,你会看到不同的途径影响并行程序的性能。后续的文章将盖在Java 8并发的改善,随着扩展包括啊卡可扩展的Java与Scala编程工具包。
Java并发支持
并发支持从平台的初期是一个Java线程和同步功能,以使其竞争优势廉洁执行语言。基于Java与Scala在JVM上运行,直接访问所有的Java运行时(包括所有的并发支持)。所以在寻找到Scala的特点,我就开始了一个快速回顾一下Java语言已经供应。
基本的Java线程
线程是易于创建和使用Java编程。他们所代表的java.lang.thread类,和编码由一个线程执行的是一种形式java.lang.runnable实例。你如果到成千上万的应用程序需要创建大量线程。当多个内核是可用的,JVM使用它们来执行多个线程同时;在核心数量过多线程共享的核心。
5:Java并发流域
Java从一开始就支持线程和同步。但小于螺纹之间的主要变化引起在Java语言,Java 5更新共享数据的防弹初始规格(JSR-133)。Java语言规范的 Java 5纠正和形式化的操作同步的和挥发性的。该规范还规定了如何不可变对象和多线程的工作。(基本上,不可变对象的引用都是线程安全的规定不允许“越狱”而构造函数被执行。)以前,线程通常需要使用阻塞之间的相互作用同步的运营的变化,使非通过使用阻塞线程之间的协调挥发性的。作为一个结果,新的并发集合类中增加了Java 5,支持非阻塞操作-在早期的阻塞线程安全的唯一方法的一个主要的改进。
协调线程的行为变得混乱。一种并发症发生因为Java编译器和JVM可以自由的在你的代码重新排序操作,只要一切保持一致,从程序的角度来看。例如:如果两个加法运算,使用不同的变量,编译器和JVM可以以相反的顺序执行你指定的操作,提供程序不使用和操作完成之前。这种灵活性来重新排序操作有助于提高Java性能,但一致性保证仅适用于单线程。硬件也可以创建线程的问题。现代系统使用多层次的快取记忆体,和高速缓存通常是没有看到相同的系统中的所有核心。当一个核心修改内存中的值,改变可能不是立即可见的其他核心。
由于这些问题,当一个线程的数据由另一个线程修改工作,你必须明确地控制多线程交互。Java使用特殊的操作提供这种控制,在看到不同线程的数据视图建立序。基本操作的线程的使用同步的关键词来访问一个对象。当一个线程同步对象,线程获取锁的对象的独家访问。如果另一个线程已持有锁,想要获得它必须等待的线程,或块,直到锁被释放。当线程继续执行内部同步的块的代码,Java可以保证线程“看见”的一切都被其他线程,先前持有的同一锁-但这些线程释放锁到他们离开自己的时间只写数据写同步的块。这保证了既适用于由编译器和JVM执行操作重新排序和硬件的内存缓存。一个内部同步的块,然后,是一个稳定的岛屿在你的代码中的线程可以轮流执行,相互作用,和共享信息的安全。
使用的挥发性的在可变的关键字提供了一个稍微弱形式的安全线程间的相互作用。的同步的关键词保证当你获得锁,你看到其他线程的商店,和其他线程后你会看到你的店获得锁。的挥发性的关键词违反这一担保分成两个单独的块。如果一个线程写入挥发性的变量,所有之前,首先得写点。如果一个线程读取变量,它认为不仅值写入该变量也是所有其他值的写作思路,写。所以阅读挥发性的变量提供了保证相同的记忆进入A同步的块,和写作挥发性的变量给出了保证相同的记忆离开A同步的块。但有一个很大的不同:阅读或写作挥发性的变量没有块。
抽象Java并发
同步是有用的,和多线程应用中只使用基本的Java开发同步的块。但协调线程可以是混乱的,特别是当你在处理多线程和多锁。确保线程安全的方式相互作用仅在和你避免潜在的死锁(两个或多个线程在等待对方才可以继续执行释放锁)变得困难。不直接与抽象,支持并发线程和锁处理给开发者更好的方法来处理常见的使用情况。
的java.util.concurrent层次结构包括集合的变化,支持并发访问,原子操作的封装类,和同步原语。许多这类被设计为支持非阻塞通道,从而避免了问题的僵局,使更高效的线程。这类更容易界定和规范之间的相互作用的线,但他们仍然受到一些基本的线程模型的复杂性。
在一对抽象java.util.concurrent包支持一个更解耦的方法来处理并发的未来的<t >接口,和执行器和ExecutorService接口这些相关的接口又是许多Scala和Java并发阿卡扩展支持的基础,所以值得看的接口及其实现的更多细节。
未来的<t >一种价值类型的人T,与扭曲的价值通常是不可用,直到一段时间后期货创建。价值是一个异步操作可能同时执行的结果。线程接收期货可以调用方法:
<!--[if !supportLists]-->· <!--[endif]-->如果值是可用的
<!--[if !supportLists]-->· <!--[endif]-->等待成为可用的值
<!--[if !supportLists]-->· <!--[endif]-->检索该值可用时
<!--[if !supportLists]-->· <!--[endif]-->如果该值是不再需要取消操作
具体实现方法期货的结构,以支持不同的处理异步操作方式。
执行器在执行任务的一个抽象的东西。这 “东西”将最终被一个线程,但具体如何执行的线程句柄是隐藏的接口。执行器是对自己有用的限制,与ExecutorService接口提供扩展的方法来管理终端和生产期货的任务的结果。所有标准的实现执行器同时实施ExecutorService因此,在实践中,你可以忽略的根接口。OA办公系统
线程是比较重量级的资源,是明智的,而不是分配和丢弃他们的重用。ExecutorService简化的线程之间共享的工作,同时也使线程自动重用,从而更容易编程和更好的性能。的线程池实现ExecutorService管理一个线程池执行任务。
应用Java并发
实际应用中经常涉及的并发需要外部交互任务(一个用户,存储,或与其他系统)是独立于你的主要处理逻辑。这种类型的应用程序很难凝聚到一个简单的例子,所以并发,人们通常使用简单的计算密集型任务,如数学计算或排序。我会用一个类似的例子。
的任务是找到最近的已知的未知的输入,在那里最近的定义为编辑距离:字符添加,删除的最小数目的变化,或需要将输入到已知的单词。我使用的是基于在一个示例代码编辑距离对维基百科的文章来计算Levenshtein距离为每个已知的单词并返回最佳匹配(或不明确的结果,如果多个已知的单词有相同的距离)。
清单1显示了用于计算Levenshtein距离的Java代码。计算生成的行和匹配两种文本的比较大小的列的矩阵,再加上一个在每个维度。为了提高效率,我们实现使用对数组大小的目标文本表示的矩阵的连续行,交换阵列中的每一次因为我需要从之前的行来计算下一行只值。
相关推荐
3. Scala的学习资料:本书《Scala程序设计:Java虚拟机多核编程实战》是由Venkat Subramaniam所著,郑有李剑翻译,是一本为Java程序员所写,讲授Scala编程的书籍。书中包含了对Scala的函数式编程基础的介绍,涵盖了...
《Scala程序设计:Java虚拟机多核编程实战》是一本专为程序员和有经验的Java开发者设计的书籍,旨在引导读者掌握Scala语言,利用其功能强大的特性进行并发编程。Scala是一种融合了函数式和面向对象编程特点的静态...
Scala结合了面向对象和函数式编程的特点,提供了更高的代码抽象能力和性能优化的可能性,是很多企业级应用和大数据处理框架(如Apache Spark)的基础。 首先,我们需要理解Scala与Java之间的相似性和差异性。Scala...
"Rock the JVM Scala Beginners" 提供了一个适合初学者的学习资源,帮助开发者掌握Scala的基础知识。在这个压缩包中,你可能会找到一系列的练习、示例代码和教程,让你逐步深入Scala的世界。 首先,Scala运行在Java...
- Java类库的兼容性:由于Scala完全兼容Java,因此可以无障碍地使用现有的Java类库。 总之,19楼社区的技术转型和架构优化是一个涉及多种技术、策略和团队协作的复杂过程。通过王治的分享,我们可以了解到Scala在...
由于Scala运行在Java虚拟机(JVM)上,因此可以直接调用Java库,而无需任何桥接代码。这使得Java开发者能够逐步迁移到Scala,而无需彻底抛弃现有的Java代码库。 在面向对象编程方面,Scala引入了特质(Traits),这...
对于Java开发者而言,学习Scala不仅能帮助他们在现有技能的基础上进一步提升,还能为解决现代软件工程中的挑战提供新的工具和技术。Scala以其独特的设计理念和强大的功能集,已经成为越来越多开发者的首选语言之一。...
- **关于并发的注释**:在涉及并发时,Scala编译器必须处理好与JVM并发模型的兼容性。 - **类型表示**:包括对各种类型(比如Java类类型、Scala类类型、数组类型、单例类型、复合类型、值类型、特殊类型)的表示和...
在当今的编程世界中,Java和Scala是两种备受瞩目的编程语言。它们各自拥有独特的特性和优势,为开发者提供了丰富的工具来构建高性能、可扩展的应用程序。Jitawawa项目正是这样一个结合了Java和Scala乐趣的实践平台,...
"basic-scala:实用的Scala基础知识"这个压缩包很可能是提供了一些学习Scala入门的基础教程和示例代码。在这个压缩包中,你可能找到关于Scala语言核心概念的详细讲解,以及如何编写和运行Scala程序的实践指导。 1. *...
2. **标准库**:Scala的标准库提供了大量的类和模块,包括集合操作、I/O、反射、并发处理等,这些是编写Scala程序的基础。 3. **Scala REPL**:Read-Eval-Print Loop,交互式解释器,允许开发者即时测试代码片段,...
Java体系结构包括三个主要部分:Java开发工具集(JDK)、Java运行时环境(JRE)和JVM。JDK是开发和调试Java应用程序的工具集合,包含JRE和额外的开发工具,如编译器(javac)和JVM调试工具。JRE则是运行Java应用程序...
综上所述,"JVM语言简介-JVM,Java,Scala [视频]"这个资源将深入讲解JVM的工作原理,Java语言的基础和高级特性,以及Scala如何在JVM上运行。对于想要深入理解和优化Java应用,或者学习Scala的人来说,这是一个非常...
**标题与描述解析** 标题提及了两本书籍资源——"Scala程序...这些知识点不仅涵盖了Scala语言的基础和高级特性,还深入到利用Scala进行JVM平台上的多核并行计算,为开发者提供了全面了解和掌握Scala编程的广阔视角。
《快学Scala》可能更注重基础知识和快速上手,适合初学者快速掌握Scala的基本语法和核心概念,如模式匹配、高阶函数、类型系统和 Actors 模型。而《Scala编程》则可能深入探讨更多高级特性和最佳实践,包括类型推导...
11. **Scala与Java互操作**:由于Scala运行在JVM上,它可以无缝地与Java代码集成,调用Java库并被Java代码调用。 12. **Scaladoc**:Scala提供了Scaladoc工具,用于生成API文档,类似于Java的Javadoc。 通过阅读...
6. ** Actors 和 Concurrency**:Scala的Actors模型提供了一种安全的并发处理方式,它通过消息传递来管理共享状态,降低了线程同步的复杂性。 7. **集合库**:Scala的集合库非常强大,提供了各种高效的集合实现,如...
Erlang和Scala通过Actor模型,能够有效地管理和调度大量并发任务,确保数据处理的高效和准确性。 #### 实际案例分析 以“天河一号”超级计算机为例,虽然其拥有惊人的峰值速度,但在实际运行中,硬件CPU的利用率却...
例如,Akka是一个用Scala编写的库,提供了actor模型来实现并发和分布式计算,它是许多企业级应用的基础。 压缩包内的"scala-2.13.8"文件夹可能包含以下内容: 1. `bin`目录:包含了Scala命令行工具,如`scala`解释...