本文翻译自http://tutorials.jenkov.com/java-concurrency/costs.html,机翻加人工校正,仅供学习交流。
多线程的代价
从单线程程序转向多线程程序不仅仅提供优点,它也会有一些代价。不要因为会使用多线程就是把一个应用程序写成多线程程序,而是有根据地认为这样做的好处要大于成本。当有疑问时,我们应该尝试测量应用程序的性能和响应能力,而不只是去靠猜测。
更复杂的设计
虽然多线程应用程序的某些部分比单线程应用程序简单,但是其他部分更为复杂。多线程访问共享数据的代码执行需要特别注意,线程交互是很复杂的,不正确的线程同步引起的错误是很难检测,重现和修复的。
上下文切换的开销
当CPU将一个正在执行的线程切换到另一个要执行的线程,CPU需要保存当前线程的本地数据、程序指针等,并加载下一个要执行的线程本地数据、程序指针等。这个切换被称为“上下文切换”。CPU将从正在执行的线程的上下文切换为将要执行的线程的上下文。
上下文切换是比较浪费系统资源。如果没有必要,你不会想在线程之间切换。
你可以阅读上下文切换在维基百科
http://en.wikipedia.org/wiki/Context_switch
(维基百科国内无法打开,有兴趣可以去百度百科查看https://baike.baidu.com/item/上下文切换/4842616?fr=aladdin)
增加资源消耗
一个线程要运行需要一些计算机资源。除了CPU时间,一个线程需要一些内存来保持其本地堆栈,也会占据需要管理线程的操作系统的资源。尝试创建一个有100个只等待线程的程序,看看应用程序运行时需要多少内存。