java - Go 和 Java 使用用户空间线程这一事实是否意味着您不能真正利用多核?

标签 java multithreading go goroutine

最近我们一直在谈论我的操作系统类(class)中的线程,我想到了一个问题。

由于 Go(和 Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效地利用多核,因为操作系统只将 CPU 时间分配给进程而不是线程自己?

This seems to confirm the fact that you can't

Wikipedia also seems to think so

最佳答案

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

它没有。它使用操作系统线程并且可以利用多个内核。

您可能对默认情况下 Go 仅使用 1 个线程来运行您的程序这一事实感到困惑。如果你开始两个goroutines他们在一个线程中运行。但是如果一个 goroutine 阻塞了 I/O,Go 创建第二个线程并继续在新线程上运行另一个 goroutine。

如果您真的想解锁完整的多核功能,只需使用 GOMAXPROCS()功能。

runtime.GOMAXPROCS(4);//main中的某个地方

现在您的程序将使用 4 个操作系统线程(而不是 1 个),并且能够充分使用例如4核系统。

关于java - Go 和 Java 使用用户空间线程这一事实是否意味着您不能真正利用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1739799/

相关文章:

c++ - 为什么可以在 C++ 中使用没有#include 线程的 std::thread ?

json - 如何在结构中存储对象

json - 如何严格解码固定长度数组?

performance - 什么时候应该初始化一个新变量,什么时候不应该?

java - 线程安全静态 map 的延迟加载

java - 为什么要同时使用 boolean 值和 interrupt() 来指示线程终止?

c# - C#中的进度条和backgroundworker

java - 如何在滚动 Pane 中设置表格以及如何显示表格标题

java - 返回更新的实体后出现 LazyInitializationException

Java在实例化抽象类时更改变量