提交 6acdf90e 编写于 作者: W wizardforcel

2021-04-22 22:37:23

上级 0d36fb49
......@@ -16,7 +16,7 @@
就像穿过森林里的小路。你可以把注意力集中在道路的碎石上,但这是毫无意义的。相反,你可以欣赏你周围的景色、树木、鸟儿和环境,这更令人愉快。这本书很相似,因为我不会只关注语言。我会不时地介绍一些接近道路的话题,并将给你一些概述和指导,你可以在你完成这本书之后去哪里。我不仅要教你语言,而且还将介绍一些算法、面向对象的编程原则、围绕 Java 开发的工具以及专业人员如何工作。这将与我们将要遵循的编码示例混合。最后,最后一章将全面讨论这个主题,接下来要学习什么,以及如何进一步成为一个专业的 Java 开发人员。
到这本书出版的时候,[爪哇已经完成了 22 年](http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html)。在这段时间里,语言发生了很大的变化,变得更好了。真正要问的问题不是它在这里呆了多久,而是它会呆多久?这门语言还值得学吗?自从 Java 诞生以来,[有许多新的语言被开发出来](http://blog.takipi.com/java-vs-net-vs-python-vs-ruby-vs-node-js-who-reigns-the-job-market/)。这些语言更加现代,并且具有函数式编程特性,顺便说一句,Java 从版本 8 开始就有了这些特性。很多人说 Java 是过去的,未来是 Scala、Swift、Go、Kotlin、JavaScript 等等。您可以将许多其他语言添加到此列表中,对于每一种语言,您都可以找到一篇庆祝 Java 诞生的博客文章。对于这一问题,有两种答案:一种是务实的商业方法,另一种更注重工程:
到这本书出版的时候,[Java已经完成了 22 年](http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html)。在这段时间里,语言发生了很大的变化,变得更好了。真正要问的问题不是它在这里呆了多久,而是它会呆多久?这门语言还值得学吗?自从 Java 诞生以来,[有许多新的语言被开发出来](http://blog.takipi.com/java-vs-net-vs-python-vs-ruby-vs-node-js-who-reigns-the-job-market/)。这些语言更加现代,并且具有函数式编程特性,顺便说一句,Java 从版本 8 开始就有了这些特性。很多人说 Java 是过去的,未来是 Scala、Swift、Go、Kotlin、JavaScript 等等。您可以将许多其他语言添加到此列表中,对于每一种语言,您都可以找到一篇庆祝 Java 诞生的博客文章。对于这一问题,有两种答案:一种是务实的商业方法,另一种更注重工程:
* 考虑到 COBOL 仍在金融业中得到积极应用,而且 COBOL 开发人员的薪酬可能比 Java 开发人员高,所以说作为一名 Java 开发人员,您将在未来 40 年内找到合适的职位并不太冒险。就我个人而言,我会赌 100 多年,但考虑到我的年龄,预测未来 20 到 40 年是不公平的。
* Java 不仅是一种语言,也是一种技术,您将从本书中了解到一些。该技术包括 **Java 虚拟机****JVM**),通常被称为 JVM,为多种语言提供了运行环境;例如 Kotlin 和 Scala,没有 JVM 就无法运行。即使 Java 将被预示,JVM 仍将是企业场景中的头号玩家。
......
......@@ -8,7 +8,7 @@
在本章中,我们将介绍以下主题:
* 进程、线程和纤的含义
* 进程、线程和纤的含义
* Java 中的多线程技术
* 多线程编程的问题及避免方法
* 锁定、同步和阻塞队列
......@@ -472,19 +472,19 @@ Java 中代码的并行执行是在线程中完成的。您可能知道 Java 运
当一个线程暂停而另一个线程启动时,操作系统必须执行上下文切换。这意味着,除其他外,必须保存 CPU 寄存器,然后将其设置为其他线程应有的值。上下文切换总是保存线程的状态,并加载要启动的线程先前保存的状态。这是一个 CPU 寄存器级别。这种上下文切换非常耗时;因此,上下文切换越多,用于线程管理的 CPU 资源就越多,而不是让它们运行。另一方面,如果没有足够的开关,一些线程可能没有足够的时间执行,程序就会挂起。
# 纤
# 纤
Java 版本 11 没有光纤,但是有一些库支持有限的光纤处理,[还有一个 JDK 项目](http://openjdk.java.net/projects/loom/),其目标是拥有支持光纤的更高版本的 JVM。因此,我们迟早会有 Java 中的纤维,因此,理解和了解它们是什么很重要。
Java 版本 11 没有纤程,但是有一些库支持有限的纤程处理,[还有一个 JDK 项目](http://openjdk.java.net/projects/loom/),其目标是拥有支持纤程的更高版本的 JVM。因此,我们迟早会有 Java 中的纤程,因此,理解和了解它们是什么很重要。
维是比线更细的单位。在线程中执行的程序代码可能会决定放弃执行,并告诉光纤管理器只执行其他光纤。有什么意义?为什么它比使用另一个线程更好?原因是这样,光纤可以避免部分上下文切换。上下文切换不能完全避免,因为开始执行它的代码的不同部分可能以完全不同的方式使用 CPU 寄存器。因为是同一个线程,所以上下文切换不是操作系统的任务,而是应用程序的任务。
程是比线更细的单位。在线程中执行的程序代码可能会决定放弃执行,并告诉纤程管理器只执行其他纤程。有什么意义?为什么它比使用另一个线程更好?原因是这样,纤程可以避免部分上下文切换。上下文切换不能完全避免,因为开始执行它的代码的不同部分可能以完全不同的方式使用 CPU 寄存器。因为是同一个线程,所以上下文切换不是操作系统的任务,而是应用程序的任务。
操作系统不知道是否使用了寄存器的值。寄存器中有位,只有看到处理器的状态,没有人能分辨出这些位是与当前代码执行相关,还是恰好以这种方式存在。编译器生成的程序确实知道哪些寄存器很重要,哪些寄存器可以忽略。这些信息在代码中的位置不同,但当需要交换机时,光纤会将需要在该点进行切换的信息传递给进行切换的代码。
操作系统不知道是否使用了寄存器的值。寄存器中有位,只有看到处理器的状态,没有人能分辨出这些位是与当前代码执行相关,还是恰好以这种方式存在。编译器生成的程序确实知道哪些寄存器很重要,哪些寄存器可以忽略。这些信息在代码中的位置不同,但当需要交换机时,纤程会将需要在该点进行切换的信息传递给进行切换的代码。
编译器计算这些信息,但 Java 在当前版本中不支持纤程。在 Java 中实现 fibers 的工具在编译阶段之后会分析和修改类的字节码。
Golang 的 goroutine 是光纤类型,这就是为什么您可以轻松地在 Go 中启动数千个,甚至数百万个 goroutine 的原因,但是建议您将 Java 中的线程数限制为较低的数目。他们不是一回事。
Golang 的 goroutine 是纤程类型,这就是为什么您可以轻松地在 Go 中启动数千个,甚至数百万个 goroutine 的原因,但是建议您将 Java 中的线程数限制为较低的数目。他们不是一回事。
尽管术语*轻量线程*正在慢慢消失,被越来越少的人使用,但纤仍然经常被称为轻量线。
尽管术语*轻量线程*正在慢慢消失,被越来越少的人使用,但纤仍然经常被称为轻量线。
# java.lang.Thread 线程
......@@ -1327,7 +1327,7 @@ playSimple N/A N/A 18,613 ± 2,040
# 摘要
在这一章中,我们学到了很多东西。首先,我们重构了代码,为使用并行猜测的进一步开发做好准备。我们熟悉了进程和线程,甚至还提到了光纤。之后,我们研究了 Java 如何实现线程以及如何创建在多个线程上运行的代码。此外,我们还看到了 Java 为需要并行程序、启动线程或只是在现有线程中启动任务的程序员提供的不同方法。
在这一章中,我们学到了很多东西。首先,我们重构了代码,为使用并行猜测的进一步开发做好准备。我们熟悉了进程和线程,甚至还提到了纤程。之后,我们研究了 Java 如何实现线程以及如何创建在多个线程上运行的代码。此外,我们还看到了 Java 为需要并行程序、启动线程或只是在现有线程中启动任务的程序员提供的不同方法。
也许这一章最重要的部分你应该记住的是官僚和不同速度的隐喻。当您想了解并发应用程序的性能时,这一点非常重要。我希望这是一幅引人入胜的图画,一幅容易记住的图画。
......
......@@ -22,7 +22,7 @@
网络在连接到它的任何两台计算机之间传送数据包。网络上使用的协议是 IP,它只是 Internet 协议的缩写。使用 IP,一台计算机可以向另一台计算机发送数据包。包包含一个头和数据内容。标头包含发件人和目标计算机的 internet 地址、其他标志以及有关包的信息。由于机器之间没有直接连接,路由器转发数据包。这就像邮局互相寄信,直到他们交到你认识的邮递员手里,邮递员可以直接把信送到你的邮箱。为此,路由器使用标头中的信息。路由器如何交互的算法和组织是复杂的,我们不需要知道一些东西,就可以成为 Java 专业人士。
如果您需要编程才能直接发送 IP 包,则应查看`java.net.DatagramPacket`,因为其余的都是在 JDK、操作系统和网卡固件中实现的。您可以创建数据包;发送数据包并更改网卡上的调制电压或向光纤发射光子不是您关心的问题。
如果您需要编程才能直接发送 IP 包,则应查看`java.net.DatagramPacket`,因为其余的都是在 JDK、操作系统和网卡固件中实现的。您可以创建数据包;发送数据包并更改网卡上的调制电压或向纤程发射光子不是您关心的问题。
IP 目前有两个版本。仍在使用的旧版本是 IPv4。与旧版本共存的新版本是 IPv6,即 IPng(*ng* 代表*新一代*)。Java 开发人员可能关心的主要区别是版本 4 使用 32 位地址,版本 6 使用 128 位地址。当您看到版本 4 的地址时,您将看到类似于`192.168.1.110`的内容,其中包含由点分隔的十进制格式的四个字节。IPv6 地址表示为`2001:db8:0:0:0:0:2:1`,八个 16 位数字以十六进制表示,用冒号分隔。
......
......@@ -965,7 +965,7 @@ public Object invoke(Object target, Method m, Object[] args)
当我们手头没有要代理的类实现的接口时,我们不能使用 JDK 方法。幸运的是,有广泛使用的库,比如`cglib`,Spring 也使用这些库来做类似的事情。`Cglib`可以创建一个代理对象来扩展原始类并实现其方法,以类似于 JDK 版本对接口方法的方式调用 handler 对象的 invoke 方法。
这些技术在运行时创建类并将其加载到 Java 内存中,它们是非常深入的技术工具。它们是高级主题。我并不是说当我还是一个 Java 程序员新手的时候不要玩它们。毕竟,会发生什么?爪哇不是一把上膛的枪。然而,重要的是,当你不了解一些细节或者一开始有些东西不起作用时,不要失去兴趣。或者第二个。或者第三。。。继续游泳。
这些技术在运行时创建类并将其加载到 Java 内存中,它们是非常深入的技术工具。它们是高级主题。我并不是说当我还是一个 Java 程序员新手的时候不要玩它们。毕竟,会发生什么?Java不是一把上膛的枪。然而,重要的是,当你不了解一些细节或者一开始有些东西不起作用时,不要失去兴趣。或者第二个。或者第三。。。继续游泳。
Spring 中的 AOP 实现通过为目标对象生成代理对象来工作,处理程序调用我们在 Spring 配置中定义的方面。这就是您不能将方面放在`final`类或`final`方法上的原因。此外,您不能在`private``protected`方法上配置方面。原则上,`protected`方法可以被代理,但这不是一个好的实践,因此 Spring AOP 不支持它。类似地,不能将方面放在不是 springbean 的类上。它们是由代码直接创建的,而不是通过 Spring 创建的,并且在创建对象时没有机会返回代理而不是原始对象。简单地说,如果不要求 Spring 创建对象,它就不能创建自定义对象。我们最不想做的就是执行这个程序,看看方面是如何执行的。审计日志的实现非常简单。我们使用标准日志,这对于审计日志的实际应用来说是不够的。我们所做的唯一特殊的事情是使用一个由名称`AUDIT_LOG`而不是类名称标识的记录器。在大多数日志框架中,这是对日志记录器的合法使用。尽管我们通常使用类来标识记录器,但是使用字符串来标识记录器是绝对可能的。在我们的日志记录中,这个字符串也将被打印在控制台的日志行中,并且它将在视觉上突出。
......
......@@ -135,7 +135,7 @@ JCL 是实现该语言的包的集合。更简单地说,它是 JDK 中包含
`java.math`包通过允许使用`BigDecimal``BigInteger`类处理更大的数字,补充了`java.lang`包的 Java 基本类型和包装类。
# 爪哇.awt, 加法计算器,和 javafx
# Java.awt, 加法计算器,和 javafx
第一个支持为桌面应用程序构建**图形用户界面****GUI**)的 Java 库是`java.awt`包中的**抽象窗口工具包****AWT**)。它为执行平台的本机系统提供了一个接口,允许创建和管理窗口、布局和事件。它还具有基本的 GUI 小部件(如文本字段、按钮和菜单),提供对系统托盘的访问,并允许启动 web 浏览器和通过 Java 代码向客户机发送电子邮件。它对本机代码的高度依赖使得基于 AWT 的 GUI 在不同的平台上看起来不同。
......
......@@ -492,7 +492,7 @@ public class ReactiveSystemDemo {
如您所见,`publish()`方法将消息发送到注册到指定地址的所有 verticle。注意,带有`ID="3"`(注册为`Two`地址)的 verticle 从未收到消息。
在我们结束这个被动系统演示之前,值得一提的是,Vert.x 允许您轻松地对 verticle 进行集群。您可以在 Vert.x 文档([中阅读此功能 https://vertx.io/docs/vertx-core/](https://vertx.io/docs/vertx-core/java)[爪哇](https://vertx.io/docs/vertx-core/java))。
在我们结束这个被动系统演示之前,值得一提的是,Vert.x 允许您轻松地对 verticle 进行集群。您可以在 Vert.x 文档([中阅读此功能 https://vertx.io/docs/vertx-core/](https://vertx.io/docs/vertx-core/java)[Java](https://vertx.io/docs/vertx-core/java))。
# 摘要
......
......@@ -174,7 +174,7 @@ list.stream().forEach(System.out::println);
有三件事值得注意:
* 根据`Comparable`接口,`compareTo()`方法必须返回负整数、零或正整数,因为对象小于、等于或大于另一个对象。在我们的实现中,如果两个对象的相同属性的值不同,我们会立即返回结果。我们已经知道这个物体*大**小*,不管其他属性是什么。但是比较两个对象的属性的顺序对最终结果有影响。它定义属性值影响顺序的优先级。
* 根据`Comparable`接口,`compareTo()`方法必须返回负整数、零或正整数,因为对象小于、等于或大于另一个对象。在我们的实现中,如果两个对象的相同属性的值不同,我们会立即返回结果。我们已经知道这个对象*大**小*,不管其他属性是什么。但是比较两个对象的属性的顺序对最终结果有影响。它定义属性值影响顺序的优先级。
* 我们已将`List.of()`的结果放入`new ArrayList()`对象中。我们这样做是因为,正如我们在第 6 章、“数据结构、泛型和流行实用程序”中已经提到的,工厂方法`of()`创建的集合是不可修改的。不能在其中添加或删除任何元素,也不能更改元素的顺序,同时需要对创建的集合进行排序。我们使用了`of()`方法,只是因为它更方便并且提供了更短的表示法
* 最后,使用`java.util.Objects`进行属性比较,使得实现比定制编码更简单、更可靠。
......@@ -360,7 +360,7 @@ System.out.println(p2.getAddress().getStreet()); //prints: 25 Main Street
# StringBuffer 和 StringBuilder 类
我们在第 6 章、*数据结构、泛型和流行实用程序中讨论了`StringBuffer`和`StringBuilder`类之间的区别。*我们这里不重复了。相反,我们只会提到,在单线程进程(这是绝大多数情况下)中,`StringBuilder`类是首选,因为它更快。
我们在第 6 章、“数据结构、泛型和流行实用程序”中讨论了`StringBuffer``StringBuilder`类之间的区别。我们这里不重复了。相反,我们只会提到,在单线程进程(这是绝大多数情况下)中,`StringBuilder`类是首选,因为它更快。
# 试,抓,最后
......@@ -411,7 +411,7 @@ System.out.println(p2.getAddress().getStreet()); //prints: 25 Main Street
# 使用库
在整本书中,我们多次提到使用**Java 类库****JCL**和外部(到**Java 开发工具包****JDK**Java 库可以使编程变得更简单,并生成更高质量的代码。甚至还有一个专门的章节,第 7 章、“Java 标准和外部库”,其中概述了最流行的 Java 库。创建图书馆的人会投入大量的时间和精力,所以你应该随时利用他们。
在整本书中,我们多次提到使用**Java 类库****JCL****Java 开发工具包****JDK**)和外部 Java 库可以使编程变得更简单,并生成更高质量的代码。甚至还有一个专门的章节,第 7 章、“Java 标准和外部库”,其中概述了最流行的 Java 库。创建图书馆的人会投入大量的时间和精力,所以你应该随时利用他们。
在第 13 章、“函数式编程”中,我们描述了驻留在 JCL 的`java.util.function`包中的标准函数式接口。这是另一种利用库的方法,使用一组众所周知的共享接口,而不是定义自己的接口。
......@@ -456,7 +456,7 @@ int i = 0;
# 测试是获得高质量代码的最短路径
我们将讨论的最后一个最佳实践是这样的陈述:*测试不是一项开销或**一项负担;它是**程序员成功的指南*。唯一的问题是什么时候写测试
我们将讨论的最后一个最佳实践是这样的陈述:*测试不是一项开销或一项负担;它是程序员成功的指南*。唯一的问题是什么时候写测试
有一个令人信服的论点,要求在编写任何一行代码之前编写一个测试。如果你能做到,那就太好了。我们不会劝你放弃的。但是,如果您不这样做,请尝试在编写完一行或所有被指定编写的代码之后开始编写测试。
......
......@@ -19,18 +19,18 @@
在本章中,我们将回顾我们认为最重要的五个 Java 增强项目:
* **巴拿马项目**:关注与非 Java 库的互操作性
* **Panama 项目**:关注与非 Java 库的互操作性
* **Valhalla 项目**:围绕引入新的值类型和相关的泛型增强而构思
* **项目 Amber**:包括 Java 语言扩展的各种工作,包括数据类、模式匹配、原始字符串文本、简明方法体和 lambda 增强,这些都是最重要的子项目
* **项目 Loom**:解决了名为**纤维**的轻量级线程的创建问题,并简化了异步编码
* **Amber 项目**:包括 Java 语言扩展的各种工作,包括数据类、模式匹配、原始字符串文本、简明方法体和 lambda 增强,这些都是最重要的子项目
* **Loom 项目**:解决了名为**纤程**的轻量级线程的创建问题,并简化了异步编码
# 巴拿马项目
在整本书中,我们建议使用各种 Java 库—标准的**Java 类库****JCL**)和外部 Java 库,这些库有助于提高代码质量并缩短开发时间。但是应用程序也可能需要非 Java 外部库。近年来,随着人们对使用机器学习算法进行数据处理的需求不断增长,这种需求也随之增加。例如,将这些算法移植到 Java 并不总是能跟上人脸识别、视频中人类行为分类和跟踪摄像机运动等领域的最新成果。
在整本书中,我们建议使用各种 Java 库—标准的 **Java 类库****JCL**)和外部 Java 库,这些库有助于提高代码质量并缩短开发时间。但是应用程序也可能需要非 Java 外部库。近年来,随着人们对使用机器学习算法进行数据处理的需求不断增长,这种需求也随之增加。例如,将这些算法移植到 Java 并不总是能跟上人脸识别、视频中人类行为分类和跟踪摄像机运动等领域的最新成果。
现有的利用不同语言编写的库的机制是**Java Native Interface****JNI**)、**Java Native Access****JNA**)和**Java Native Runtime****JNR**)。尽管有这些功能,访问本机代码(为特定平台编译的其他语言的代码)并不像使用 Java 库那么容易。此外,它限制了**Java 虚拟机****JVM**)的代码优化,经常需要用 C 语言编写代码
现有的利用不同语言编写的库的机制是 **Java 本机接口****JNI**)、**Java 本机访问****JNA**)和 **Java 本机运行时****JNR**)。尽管有这些功能,访问本机代码(为特定平台编译的其他语言的代码)并不像使用 Java 库那么容易。此外,它限制了 **Java 虚拟机****JVM**)的代码优化,经常需要用 C 语言编写代码
[**巴拿马**项目](https://openjdk.java.net/projects/panama)为了解决这些问题,包括 C++功能的支持。作者使用的术语是**外国图书馆***。*这个术语包括所有其他语言的图书馆。新方法背后的思想是使用一个名为**jextract**的工具将本机头翻译成相应的 Java 接口。生成的接口允许直接访问本机方法和数据结构,而无需编写 C 代码。
[**巴拿马**项目](https://openjdk.java.net/projects/panama)为了解决这些问题,包括 C++功能的支持。作者使用的术语是**外部库**。这个术语包括所有其他语言的库。新方法背后的思想是使用一个名为 **jextract** 的工具将本机头翻译成相应的 Java 接口。生成的接口允许直接访问本机方法和数据结构,而无需编写 C 代码。
毫不奇怪,支持类计划存储在`java.foreign`包中。
......@@ -38,13 +38,13 @@
# 瓦尔哈拉项目
**瓦尔哈拉项目**[的动机 https://openjdk.java.net/projects/valhalla](https://openjdk.java.net/projects/valhalla)源于这样一个事实,即自从 Java 在大约 25 年前首次引入以来,硬件已经发生了变化,当时做出的决定在今天会有不同的结果。例如,从内存获取值的操作和算术操作在性能时间方面产生的成本大致相同。如今,情况发生了变化。内存访问比算术运算长 200 到 1000 倍。这意味着涉及原始类型的操作要比基于它们的包装类型的操作便宜得多。
[**valhalla 项目**](https://openjdk.java.net/projects/valhalla)源于这样一个事实,即自从 Java 在大约 25 年前首次引入以来,硬件已经发生了变化,当时做出的决定在今天会有不同的结果。例如,从内存获取值的操作和算术操作在性能时间方面产生的成本大致相同。如今,情况发生了变化。内存访问比算术运算长 200 到 1000 倍。这意味着涉及原始类型的操作要比基于它们的包装类型的操作便宜得多。
当我们使用两个基本类型做一些事情时,我们获取值并在操作中使用它们。当我们对包装器类型执行相同的操作时,我们首先使用引用来访问对象(相对于 20 年前的操作本身,对象现在要长得多),只有这样我们才能获取值。这就是为什么 Valhalla 项目试图为引用类型引入一个新的**值**类型,它提供了对值的访问,而无需使用引用,就像原始类型通过值可用一样。
它还将节省内存消耗和包装数组的效率。现在,每个元素将由一个值表示,而不是由引用表示。
这样的解决方案从逻辑上引出了泛型问题。今天,泛型只能用于包装类型。我们可以写`List<Integer>`,但不能写`List<int>`。这也是瓦尔哈拉项目准备解决的问题。它将*扩展泛型类型,以支持泛型类和接口在原始类型*上的特化。扩展也允许在泛型中使用原始类型。
这样的解决方案从逻辑上引出了泛型问题。今天,泛型只能用于包装类型。我们可以写`List<Integer>`,但不能写`List<int>`。这也是瓦尔哈拉项目准备解决的问题。它将扩展泛型类型,以支持泛型类和接口在原始类型上的特化。扩展也允许在泛型中使用原始类型。
# 琥珀色项目
......@@ -54,7 +54,7 @@ Amber 项目创建的两个 Java 特性已经交付,我们讨论了它们:
* 类型保持架`var`(参见第 1 章、“Java 12 入门”)从 Java 10 开始使用。
* Java 11 中增加了 lambda 参数的局部变量语法(参见第 13 章、“函数式编程”。
* 不太详细的`switch`语句(参见第 1 章、*java12 入门*)是作为 java12 的预览特性引入的。
* 不太详细的`switch`语句(参见第 1 章、“java12 入门”)是作为 java12 的预览特性引入的。
未来的 Java 版本还将发布其他新特性。在下面的小节中,我们将只仔细研究其中的五个:
......@@ -91,9 +91,9 @@ record Person(int age, String firstName, String lastName) {}
但是,[正如 Brian Goetz 所写](https://cr.openjdk.java.net/~briangoetz/amber/datum.html),问题来了:
*"Are they extensible? Are the fields mutable? Can I control the behavior of the generated methods or the accessibility of the fields? Can I have additional fields and constructors?"*
“它们是可扩展的吗?字段是可变的吗?我可以控制生成的方法的行为或字段的可访问性吗?我可以添加其他字段和构造函数吗?”
-*布莱恩·戈茨*
——布莱恩·戈茨
正是在这种情况下,这一思想的当前状态正处于试图限制范围,并仍然为语言提供价值的中间阶段。
......@@ -166,7 +166,7 @@ String s = "The result:\n" +
System.out.println(s);
```
添加新的*原始字符串文字后,*相同的代码可以更改为如下所示:
添加新的*原始字符串字面值*后,相同的代码可以更改为如下所示:
```
String s = `The result:
......@@ -314,22 +314,22 @@ Java 中的线程是基于 OS 内核线程的,这是一个通用线程。但
添加这样的复杂性使得 Java 不像以前那么容易学习,而 Loom 项目将通过使 Java 更加轻量级来重新使用 Java 并发处理的简单性。
该项目计划向 Java 添加一个新类`Fiber`,以支持由 JVM 管理的轻量级线程构造。纤占用的资源要少得多。它们也几乎没有或几乎没有上下文切换的开销,当一个线程挂起时,另一个线程必须启动或继续它自己的由于 CPU 时间共享或类似原因而挂起的作业。当前线程的上下文切换是性能受限的主要原因之一。
该项目计划向 Java 添加一个新类`Fiber`,以支持由 JVM 管理的轻量级线程构造。纤占用的资源要少得多。它们也几乎没有或几乎没有上下文切换的开销,当一个线程挂起时,另一个线程必须启动或继续它自己的由于 CPU 时间共享或类似原因而挂起的作业。当前线程的上下文切换是性能受限的主要原因之一。
为了让您了解与线相比,纤有多轻,织机开发商罗恩·普雷斯勒(Ron Pressler)和艾伦·贝特曼(Alan Bateman)[提供了以下数字](http://cr.openjdk.java.net/~rpressler/loom/JVMLS2018.pdf):
为了让您了解与线相比,纤有多轻,织机开发商罗恩·普雷斯勒(Ron Pressler)和艾伦·贝特曼(Alan Bateman)[提供了以下数字](http://cr.openjdk.java.net/~rpressler/loom/JVMLS2018.pdf):
* **螺纹**:
* **线程**:
* 通常为栈保留 1 MB+16 KB 的内核数据结构
* 每个启动线程约 2300 字节,包括**虚拟机**(**虚拟机**元数据
* **光纤**:
* 每个启动线程约 2300 字节,包括**虚拟机**(**VM**)元数据
* **纤程**:
* 延续栈:数百字节到 KBs
* 当前原型中每根光纤 200-240 字节
* 当前原型中每根纤程 200-240 字节
如您所见,我们希望并行处理的性能会有显著的改进。
术语**续**并不新鲜。在*纤维*之前使用。它表示*一个顺序执行的指令序列,可以挂起自身*。并发处理器的另一部分是**调度器**,它*将继续分配给 CPU 核心,将暂停的一个替换为准备运行的另一个,并确保准备恢复的继续最终将分配给 CPU 核心。*当前的线程模型也有一个延续和一个调度程序,即使它们并不总是作为 API 公开。Loom 项目打算将 continuation 和 scheduler 分开,并在它们之上实现 Java 纤维。现有的`ForkJoinPool`可能会用作纤维
术语**延续**并不新鲜。在*纤程*之前使用。它表示*一个顺序执行的指令序列,可以挂起自身*。并发处理器的另一部分是**调度器**,它将延续分配给 CPU 核心,将暂停的一个替换为准备运行的另一个,并确保准备恢复的延续最终将分配给 CPU 核心。当前的线程模型也有一个延续和一个调度程序,即使它们并不总是作为 API 公开。Loom 项目打算将 continuation 和 scheduler 分开,并在它们之上实现 Java 纤程。现有的`ForkJoinPool`可能会用作纤程
您可以在项目建议书([中阅读更多关于织布机项目动机和目标的信息 https://cr.openjdk.java.net/~rpressler/loom/loom-Proposal.html](https://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html)),这对于任何 Java 开发人员来说都是一本相对简单且非常有启发性的读物。
[您可以在项目提案](https://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html)中阅读更多关于织布机项目动机和目标的信息,这对于任何 Java 开发人员来说都是一本相对简单且非常有启发性的读物。
# 斯卡拉项目
......
......@@ -2,7 +2,7 @@
本书的第二部分构成了 Java 演示的主要部分。它讨论了主要的 Java 组件和结构,以及算法和数据结构。详细回顾了 Java 的异常系统,还介绍了 String 类和 I/O 流,以及允许管理文件的类。
本文讨论并演示了 Java 集合和三个主要接口——`List``Set``Map`——并解释了泛型,接着介绍了用于管理数组、对象和时间/日期值的实用程序类。这些类属于**Java 类库****JCL**),我们也讨论了其中最流行的包。第三方库在编程专业人士中很受欢迎,对它们进行了补充。
本文讨论并演示了 Java 集合和三个主要接口——`List``Set``Map`——并解释了泛型,接着介绍了用于管理数组、对象和时间/日期值的实用程序类。这些类属于 **Java 类库****JCL**),我们也讨论了其中最流行的包。第三方库在编程专业人士中很受欢迎,对它们进行了补充。
所提供的资料引发了对编程方面的讨论,如性能、并发处理和垃圾收集,这些都是 Java 设计的核心。它与有关图形用户界面和数据库管理的专门章节一起,涵盖了所有强大 Java 应用程序的所有三个层次:前端、中间和后端。有关网络协议和应用程序相互通信方式的一章完整地描述了应用程序可以进行的所有主要交互。
......@@ -16,9 +16,9 @@
第 7 章“Java 标准和外部库”
第 8 章*多线程并发处理*
第 8 章“多线程并发处理”
第 9 章*JVM 结构及垃圾收集*
第 9 章“JVM 结构及垃圾收集”
第 10 章“管理数据库中的数据”
......
......@@ -8,7 +8,7 @@
本节包含以下章节:
第 13 章“函数式编程”
第 13 章“函数式编程”
第 14 章“Java 标准流”
......@@ -16,8 +16,8 @@
第 16 章“微服务”
第 17 章*爪哇微基准线束*
第 17 章“Java 微基准线束”
第 18 章“编写高质量代码的最佳实践”
第 19 章*Java 新特性*
\ No newline at end of file
第 19 章“Java 新特性”
\ No newline at end of file
......@@ -26,16 +26,16 @@ Java 的第一个版本在 1996 年作为 Java1 发布。从那时起,出现
下表提供了 Java 9 之前的 Java 发行历史的压缩视图:
| **发布名称** | **版本** | **发布年份** | **代号** |
| 爪哇 1 | 1 | 1996 | 橡树 |
| Java 1 | 1 | 1996 | 橡树 |
| Java 1.1 版 | 1.1 | 1997 | (阿比盖尔、布鲁图斯、切尔西) |
| 爪哇 2 | 1.2 | 1998 | 游乐场 |
| 爪哇 3 | 1.3 | 2000 | 红隼 |
| 爪哇 4 | 1.4 | 2002 | 梅林 |
| 爪哇 5 | 1.5 | 2004 | 老虎 |
| 爪哇 6 | 1.6 | 2006 | 野马 |
| 爪哇 7 | 1.7 | 2011 | 海豚 |
| 爪哇 8 | 1.8 | 2014 | 蜘蛛 |
| 爪哇 9 | 9 | 2017 | *不再使用代号 |
| Java 2 | 1.2 | 1998 | 游乐场 |
| Java 3 | 1.3 | 2000 | 红隼 |
| Java 4 | 1.4 | 2002 | 梅林 |
| Java 5 | 1.5 | 2004 | 老虎 |
| Java 6 | 1.6 | 2006 | 野马 |
| Java 7 | 1.7 | 2011 | 海豚 |
| Java 8 | 1.8 | 2014 | 蜘蛛 |
| Java 9 | 9 | 2017 | *不再使用代号 |
Java9 的发布是对 Java 平台和每个版本的编号方式的重大改变。在后 Java9 版本中,Oracle 决定放弃基于特性的模型,转而选择时间发布的模型
......@@ -61,7 +61,7 @@ Java9 于 2017 年发布,2018 年计划发布两个版本。这些版本是 Ja
* 使用 Java Shell
* 控制外部过程
* 使用 G1 提高性能
***爪哇微基准线束****JMH**测量性能)
***Java微基准线束****JMH**测量性能)
* 为 HTTP 2.0 做准备
* 包含反应式编程
......
......@@ -216,7 +216,7 @@ Oracle 从 java9 开始就支持语义版本控制。对于 Java,Java 版本
Java9 有三个版本:初始版本和两个更新。下面列出的版本演示了主要的次要安全模式:
* 爪哇 SE 9
* Java SE 9
* Java SE 9.0.1 版
* Java SE 9.0.4 版
......
......@@ -309,7 +309,7 @@ Example example = new Example<>()
};
```
该错误是由于对匿名内部类使用菱形运算符而导致的。爪哇 9 救命!虽然前面的代码在 Java8 中会导致编译时错误,但在 Java9、10 和 11 中工作正常。
该错误是由于对匿名内部类使用菱形运算符而导致的。Java 9 救命!虽然前面的代码在 Java8 中会导致编译时错误,但在 Java9、10 和 11 中工作正常。
# 停止使用下划线
......
......@@ -984,7 +984,7 @@ Oracle 将 JVMCI 保持在 java9 中的实验性,以允许进一步的测试
为了充分把握这一变化,我们将在进一步讨论本 JEP 之前回顾`JavaBean``BeanProperty``SwingContainer`
# 爪哇
# Java
`JavaBean`是一个 Java 类。与其他 Java 类一样,`JavaBean`是可重用代码。它们在设计上是独特的,因为它们将多个对象封装成一个对象。`JavaBean`类必须遵循三个约定:
......
......@@ -26,12 +26,12 @@ Java 社区由数以百万计的开发人员组成,他们以一种或多种方
internet 上有几个 Java 论坛。甲骨文在[开设了一个官方的 Java 社区空间 http://community.oracle.com](http://community.oracle.com)。Java 社区空间组织为以下空间:
| 爪哇 | Java 冠军 |
| #爪哇 20 | Java 社区进程 |
| Java | Java 冠军 |
| #Java 20 | Java 社区进程 |
| Java 软件包 | Java 应用程序接口 |
| 数据库连接 | 爪哇 SE |
| 数据库连接 | Java SE |
| Java 安全性 | Java 热点虚拟机 |
| 爪哇 EE | 嵌入式技术 |
| Java EE | 嵌入式技术 |
| Java 开发工具 | 文章档案 |
| Java.net 锻造日落 | 纳索恩 |
| 新 Java 空间的构想 | Java 用户组 |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册