Java如何使用多个内核?
JVM在一个进程中运行,JVM中的线程共享属于该进程的堆。 那么JVM如何利用提供多个操作系统线程的多个内核来提高并发性?
您可以使用多个线程使用多个核心。 但是使用比机器中的核心数量更多的线程可能会浪费资源。 您可以使用availableProcessors()来获取核心数量。
在Java 7中有fork / join框架来利用多个内核。
相关问题:
- multithreadingalgorithm需要使用多核处理器吗?
- 每个处理器的线程数
- 在Java中正确的multithreading快速sorting或合并algorithm?
绿色线程被Java 1.2中的本地线程取代。
如果操作系统在可用处理器上分配线程,Java将受益于多核。 JVM本身并没有做任何特殊的事情来让它的线程在多个内核之间均匀调度。 有几件事要记住:
- 在实现并行algorithm的同时,可能会更好地产生与内核一样多的线程。 (
Runtime.getRuntime().availableProcessors()
)。 不多,不less。 - 利用
java.util.concurrent
包提供的function。 - 确保您的个人图书馆具有Java实践中的Java并发 。
一堆好的答案在这里,但我想我会为后人增加一些细节。
JVM在一个进程中运行,JVM中的线程共享属于该进程的堆。 那么JVM如何利用提供多个操作系统线程的多个内核来实现高并发?
正如其他人所提到的,如果在多CPU机器上运行,Java将利用底层OS的线程来执行在不同CPU上执行代码的实际工作。 当一个Java线程启动时,它创build一个关联的OS线程和操作系统负责调度等.JVM确实对线程和Java语言进行了一些pipe理和跟踪,如volatile
, synchronized
, notify()
, wait()
等都会影响OS线程的运行状态。
JVM在一个进程中运行,JVM中的线程共享属于该进程的堆。
JVM不需要“在单个进程中运行”,因为即使垃圾收集器和其他JVM代码也运行在不同的线程中,操作系统通常将这些不同的线程表示为不同的进程。 例如,在Linux中,您在进程列表中看到的单个进程通常会伪装成一堆不同的线程进程。 即使你在一台核心机器上,也是如此。
然而,你们是正确的,他们都共享相同的堆空间。 他们实际上共享相同的整个内存空间,这意味着代码,internedstring,堆栈空间等。
那么JVM如何利用提供多个操作系统线程的多个内核来实现高并发?
线程从几个原因得到他们的性能改进。 显然,直接并发通常会使程序运行得更快。 能够同时执行多个CPU任务可以(虽然不总是)提高应用程序的吞吐量。 您也可以将IO操作隔离到单个线程,这意味着其他线程可以在线程等待IO(读/写到磁盘/networking等)时运行。
但就内存而言,由于本地每CPUcaching内存,线程可以获得很多性能改进。 当一个线程在一个CPU上运行时,CPU的本地高速缓冲存储器帮助线程在本地隔离存储请求,而不必花费时间读取或写入中央存储器。 这就是为什么volatile
和synchronized
调用包含内存同步结构的原因,因为当线程需要协调工作或相互通信时,高速caching内存必须刷新到主内存或无效。