首页 > 解决方案 > 为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?

问题描述

Java并发实践:

对于此类不进行 I/O 且不访问共享数据的计算问题,N cpu或 N cpu + 1 个线程会产生最佳吞吐量;更多线程无济于事,实际上可能会因为线程竞争 CPU 和内存资源而降低性能。

为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?

我的理解:

I/O操作会被阻塞。共享数据会被锁同步,其他线程也会被阻塞等待共享数据锁。如果只有N个cpu线程,线程会被阻塞,cpu会保持空闲,导致cpu闲置。

我的理解正确吗?

标签: javamultithreadingconcurrency

解决方案


为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?

他们不一定需要 更多线程。

引用的意思是,具有显着 I/O 或显着锁争用的问题可能2 受益于比 CPU 更多的线程。添加更多线程可能会增加吞吐量。如果一个线程在 I/O 或锁上阻塞,调度程序将尝试将 CPU 重新分配给另一个线程。因此,如果线程数多于 CPU,则更有可能有线程等待运行。


1 - 例如,如果没有任何实际工作要做,添加线程没有任何区别。此外,您可能不希望应用程序使用所有可用资源。“最佳吞吐量”可能需要在比单个 Java 应用程序更大的范围内考虑。
2 - 我们不能说它受益。例如,如果系统已经 I/O 饱和,那么添加一个只会产生更多 I/O 流量的额外线程将无济于事。类似的论点可能适用于锁争用。


推荐阅读