Go和Java使用用户空间线程的事实是否意味着你无法真正利用多核心?

Gab*_*yer 14 java multithreading go goroutine

我们最近一直在讨论操作系统类中的线程,我想到了一个问题.

由于Go,(和Java)使用用户空间线程而不是内核线程,这是否意味着您无法有效利用多个内核,因为操作系统只为进程分配CPU时间而不是线程本身?

这似乎证实了你不能这样做的事实

维基百科似乎也这么认为

jit*_*ter 17

是什么让你认为Go使用用户空间线程?

它没有.它使用OS线程,可以利用多个内核.

您可能会对以下事实感到困惑:默认情况下Go只使用1个线程来运行您的程序.如果你启动两个goroutines,他们会在一个线程中运行.但是如果I/O Go的一个goroutine块创建了第二个线程并继续在新线程上运行另一个goroutine.

如果您真的想解锁完整的多核电源,请使用该GOMAXPROCS()功能.

runtime.GOMAXPROCS(4); //somewhere in main

现在你的程序将使用4个OS线程(而不是1个)并且能够完全使用例如4核心系统.


Tom*_*ine 6

最新版本的Java使用OS线程,尽管不一定与Java线程进行一对一映射.Java显然在许多硬件线程中都能很好地工作.