03、Java并发编程:多线程的代价(程序设计,上下文切换,资源消耗)
把程序从单线程转变到多线程并非仅仅带来好处,也需付出代价。我们不应该一味的让程序支持多线程,而只应在权衡了利大于弊的情况使用多线程。当我们不能确定时,可以先试着衡量下程序的性能和响应性,而不是凭空猜想。
多线程的设计更复杂
虽然多线程程序的某些部分比单线程更简单,但是其他部分更复杂。多线程代码在执行时需要特别注意共享数据的访问。线程之间的交互远不是一直这么简单的。因没有正确线程同步而引起的错误会很难发现,复现和解决。
多线程上下文切换带来开销
CPU从一个线程切换到另一线程执行时,需要保存当前线程的局部数据和程序指针等,还要加载下一个线程待执行的局部数据和程序指针等。这个切换称为“上下文切换”。CPU从某个线程的执行上下文切换到另一个线程的执行上下文。
上下文切换的开销可不低,在没必要时不应在线程之间切换。
在维基百科上可以读到更多关于上下文切换的内容:
http://en.wikipedia.org/wiki/Context_switch
多线程增加了资源消耗
线程需要一定的计算机资源才能运行,除了CPU时间,还需一定的内存来保存局部栈,可能还需要占用操作系统的一些资源来管理线程。我们可以试试在一个程序中创建100个线程,这些线程不做任何事只是等待,然后看看该程序在运行时占用了多少内存。