`java.io`包包含支持许多(但不是所有)可能数据源的类。它主要围绕文件、网络流和内部内存缓冲区的输入来构建。它不包含许多网络通信所必需的类。它们属于 Java 网络 API 的`java.net`、`javax.net`等包。只有在建立了网络源或目的地(例如网络套接字)之后,程序才能使用`java.io`包的`InputStream`和`OutputStream`类读写数据
`java.nio`包的类与`java.io`包的类具有几乎相同的功能。但是,除此之外,它们还可以在非阻塞的 T3 模式下工作,这可以在某些情况下显著提高性能。我们将在第 15 章“反应式编程”中讨论非阻塞处理。
考虑的第一个特征是系统中 CPU 的数量,因此线程池的大小至少可以与 CPU 的计数一样大。然后,您可以监视应用程序,查看每个线程占用 CPU 的时间以及占用其他资源(如 I/O 操作)的时间。如果不使用 CPU 所花费的时间与线程的总执行时间相当,则可以按以下比率增加池大小:不使用 CPU 的时间除以总执行时间。但这是在另一个资源(磁盘或数据库)不是线程间争用的主题的情况下。如果是后者,那么您可以使用该资源而不是 CPU 作为描述因子。
...
...
@@ -739,7 +739,7 @@ class CalculatorSyncBlock implements Calculator {
}
```
如您所见,synchronized 块在`this`对象上获取一个锁,该锁由两个线程共享,并且只有在线程退出块之后才释放它。在我们的演示代码中,该块覆盖了该方法的所有代码,因此在性能上没有差异。但是想象一下这个方法中有更多的代码(我们将位置注释为`there may be some other code here`。如果是这样的话,代码的同步部分就更小,因此成为瓶颈的机会就更少。
如您所见,`synchronized`块在`this`对象上获取一个锁,该锁由两个线程共享,并且只有在线程退出块之后才释放它。在我们的演示代码中,该块覆盖了该方法的所有代码,因此在性能上没有差异。但是想象一下这个方法中有更多的代码(我们将位置注释为`there may be some other code here`。如果是这样的话,代码的同步部分就更小,因此成为瓶颈的机会就更少。