多线程的代价

更新于 2025-12-28

Jakob Jenkov 2021-03-08

从单线程应用程序转向多线程应用程序,并不仅仅带来好处,同时也伴随着一些代价。不要仅仅因为你“可以”就对应用程序启用多线程。你应该有充分的理由预期这样做所带来的收益大于其成本。如果不确定,应尝试测量应用程序的性能或响应速度,而不是凭空猜测。

更复杂的设计

尽管多线程应用程序的某些部分比单线程更简单,但其他部分却更加复杂。当多个线程执行访问共享数据的代码时,需要特别注意。线程之间的交互往往并不简单。由于线程同步错误所引发的问题通常非常难以检测、复现和修复。

上下文切换开销

当 CPU 从执行一个线程切换到执行另一个线程时,需要保存当前线程的局部数据、程序指针等信息,并加载下一个要执行线程的相应信息。这种切换称为“上下文切换”(Context Switch)。CPU 从一个线程的上下文中切换到另一个线程的上下文中执行。

上下文切换并非没有代价。你不希望在线程之间进行不必要的频繁切换。

资源消耗增加

线程运行时需要占用计算机的一些资源。除了 CPU 时间外,每个线程还需要一定的内存来维护其本地栈。此外,操作系统内部也需要分配一些资源来管理线程。你可以尝试编写一个程序,创建 100 个只做等待操作的线程,观察该程序运行时占用多少内存。